Codeforces Round #180 (Div. 1)

A
假设1的个数是偶数个(设为x),那么1的个数不可能超过x个。
假设1的个数是奇数个(设为x),那么1的个数可以变为x+1个。
当然,想要1的数目变少只要不断地pop就可以了。
显然,0可以在中间随便插,所以最后只要判1的个数。

B
当且仅当我们可以找到这样一组匹配的时候,A没法超过B:
对于每个$$0 \leq i \lt n$$有$$a[i] \leq b[match[i]]$$
证明:
1、显然有此匹配时,$$\sum a_i \leq \sum b_i$$。
2、当没有这种匹配时,对于没有被匹配到的a[i],重量取个超级大的数,然后后面的重量都一样,那么A就可以超过B了。
所以只要a, b sort一下作一下判断就可以了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <queue>
#include <stack>
#include <vector>
using namespace std;

typedef long long ll;

#define foreach(it, v) for (__typeof((v).end()) it = (v).begin(); it != (v).end(); it++)
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define forn(i, a, b) for (int i = (int)(a); i <= (int)(b); i++)
#define clr(a, x) memset(a, x, sizeof(a))
#define all(v) (v).begin(), (v).end()
const int N = 100005;
int m, n, k;
int a[N], b[N];

int main() {
    scanf("%d%d%d", &m, &n, &k);
    rep (i, m) scanf("%d", &a[i]);
    rep (i, n) scanf("%d", &b[i]);
    sort(a, a + m);
    sort(b, b + n);
    int j = 0;
    bool flag = 0;
    rep (i, m) {
        while (j < n && b[j] < a[i]) j++;
        if (j == n) {
            flag = 1;
            break;
        }
        j++;
    }
    puts(flag ? "YES" : "NO");
}

C
构造题不懂……其实就是太弱,一直以为6 0 1 2 3 4 5这组数据是无解的,导致后面想歪了。
看了rng_58的代码茅塞顿开。
其实根本没有无解的情况
按s sort一下,然后令m = (n + 2) / 3。
第一部分(0 <= i < m):a[i] = 0, b[i] = s[i] 第二部分(m <= i < m + m):a[i] = s[i], b[i] = 0 第三部分(m + m <= i < n):a[i] = n - i - 1, b[i] = s[i] - a[i] 第一部分的用意是把a的[1,m-1]这个区间内的值空出来 第二部分的用意是把b里[s[m - 1] + 1, +oo)这个区间的值空出来 第三部分a就把第一部分的坑填了,b则保证了大于s[m - 1],并且b值严格递增。 不得不服。 D 先保证m<=n,然后让横的限制全满足,竖的限制满足超过一半即可。只需要0,1就够了。 E 坑

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注