CF 281 div2 小记

problems: http://codeforces.com/contest/493

 

晚上11点开始的,只看了B和C,然后睡了,悲剧的是C一直没发现空间开小了,然后各种改都是WA,早上起来一看B又被黑了,然后发现long long的情况没处理。

B是水题,如果求和来判断第一种情况注意使用long long。

C题暴力:对每个可能成为最优解的d都求出a和b,然后更新即可。首先,对每个a[i], (a[i]-1, a[i],a[i]+1)这三个数都可以作为d,同样对b[i],构造一个c序列存放所有可能成为最优解的d。其次,对每个d如何求出aa和bb?其实只要对a[]和b[]排序,然后用upper_bound就行了,具体见下代码。

 

// C
# include <stdio.h>
# include <algorithm>
const int maxn = 200005;
int n, m, k;
int a[maxn], b[maxn];
int c[6*maxn+105];
const int inf = 0x7fffffff;
void add(int x)
{
    if (x < 0 ) return ;
    c[k++] = x;
}
int main()
{
    k = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", &a[i]), add(a[i]-1), add(a[i]), add(a[i]+1);
    scanf("%d", &m);
    for (int i = 0; i < m; ++i) scanf("%d", &b[i]), add(b[i]-1), add(b[i]), add(b[i]+1);

    std::sort(a, a+n);
    std::sort(b, b+m);
    std::sort(c, c+k);
    int ans = -inf, aa, bb;

    for (int i = 0; i < k; ++i) {
        int ta = std::upper_bound(a, a+n, c[i]) - a;
        int tb = std::upper_bound(b, b+m, c[i]) - b;
        ta = ta*2 + (n-ta)*3;
        tb = tb*2 + (m-tb)*3;
        if (ans < ta - tb) {
            ans = ta - tb;
            aa = ta;
            bb = tb;
        } else if (ans == ta-tb && ta > aa) {
            aa = ta;
            bb = tb;
        }
    }

    printf("%d:%d\n", aa, bb);

    return 0;
}
posted @ 2014-12-04 13:17  努力变瘦  阅读(183)  评论(0编辑  收藏  举报