Educational Codeforces Round 115 (Rated for Div. 2)


B. Groups

思路:

只要找到是否有两天满足条件即可,我们可以这么分析,对于任意的两天,看这n组学生:

一天有课且另一天没课的记为cnt1

一天没课且另一天有课的记为cnt2

两天都有课的记为cnt3

两天都没课的记为cnt4

而两天都有课cnt3的可以放到cnt1中也可以放到cnt2中,我们只要满足cnt1+cnt3>=n/2,且cnt2+cnt3>=n/2,且cnt4==0,就代表有方案

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <vector>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int>PII;

const int N = 200010;
const int MOD = 1000000007;

int a[N][6];

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= 5; j++)
                cin >> a[i][j];

        bool flag = false;
        for (int i = 1; i <= 5; i++)
            for (int j = i + 1; j <= 5; j++)
            {
                int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
                for (int k = 1; k <= n; k++)
                {
                    if (a[k][i] && !a[k][j]) cnt1++;
                    if (!a[k][i] && a[k][j]) cnt2++;
                    if (a[k][i] && a[k][j])  cnt3++;
                    if (!a[k][i] && !a[k][j]) cnt4++;
                }
                if (cnt1 + cnt3 >= n / 2 && cnt2 + cnt3 >= n / 2 && cnt4 == 0) flag = true;
            }

        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

 D. Training Session

思路:

排列组合问题,容斥原理,首先正难则反,我们可以先求出全集,然后减去不符合条件的个数,假设有A,B,C三个人,那么不符合的情况就为A的a属性和B相同,且A的b属性和C相同,就像下面这种情况:

 

那么当前这个数不满足条件的总数就为(和A相同的个数-1)乘上(和B相同个数的-1),-1是减去本身

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200010, M = 100010, MOD = 1000000007, INF = 0x3f3f3f3f;

int a[N], b[N];
map<int, int> mpa, mpb;

int main()
{
    IOS;
    int T;
    cin >> T;
    while(T -- )
    {
        int n;
        cin >> n;
        mpa.clear();
        mpb.clear();
        for(int i = 1; i <= n; i ++ ) 
        {
            cin >> a[i] >> b[i];
            mpa[a[i]]++, mpb[b[i]]++;
        }
        LL res = (LL)n * (n - 1) * (n - 2) / 6;
        for (int i = 1; i <= n; i ++ )
            res -= (LL)(mpa[a[i]] - 1) * (mpb[b[i]] - 1);

        cout << res << endl;
    }
    return 0;
}

 

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM