【组队训练】2013南京区域赛

大概是第四五次组队训练了。

四题。

第一次进铜牌线了= =(苦笑

A题,水题,队友看一会就敲了,1A。

J题,我看的,没看懂,叫队友和我一起看,三个人在没有讨论的情况下,全都理解错题意,凑不出样例,后来zr说,before和after应该是空间的,恍然大悟……

因为当RYB都>=2的时候有公式,我就直接分类讨论其他情况。写的……shi一样……wa了好几次,和zr一起找了半天,7A……

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define CLR(x, v) memset(x, v, sizeof x);
#define PI(x) printf("%lld
", (ll)(x))
const int N = 100005;

void sort(ll &a, ll &b, ll &c) {
    ll x = min(a, min(b,c));
    ll y = max(a, max(b,c));
    ll z = (a+b+c)-x-y;
    a = x; b = z; c = y;
}

int main() {
    //freopen("in.txt", "r", stdin);
    ll a, b, c;
    while (~scanf("%lld%lld%lld", &a, &b, &c)) {
        sort(a, b, c);
        ll tot = a+b+c;
        if (a >= 2 && b >= 2 && c >= 2) {
            PI(15+(tot-6)*6);
        } else if (c == 0) {
            // zero color
            PI(0);
        } else if (b == 0) {
            // one color
            if(c == 1)
            PI(0);
            else
            PI((tot-2)*2+1);
        } else if (a == 0) {
            // two colors
            if (b == 1 && c == 1) PI(1);
            else if (b == 1 && c == 2) PI(3);
            else if (b == 1) PI(3+(c-2)*3);
            else PI(6+(tot-4)*4);
        } else {
            if (b == 1 && c == 1) PI(3);
            else if (b == 1) PI(6+(c-2)*4);
            else if (b >= 2) PI(10+(b+c-4)*5);
            else while (1);
        }
    }
    return 0;
}
View Code

I题,搞完J就开始看I题,队友说是不是什么数据结构,我想了下dp觉得没什么思路,便想到对每一位进行运算O(N^2*b) b是数据二进制位数,题面并没有说数据范围,我有点怕超时,和队友说了下想法,还是建议我写一发,因为也比较好写,抱着wa也不能空着的心态写了一下,调了下过了样例就交了,忘记写回车PE一次,2A。很惊喜。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define CLR(x, v) memset(x, v, sizeof x);
#define PI(x) printf("%lld
", (ll)(x))
const int N = 1005;

int a[N];
int bit[50], ans[50];
int midx;
int c[N][N];
const int MOD = 1000003;
int n;

void up(int &x, int y) { if(y>x)x=y; }
void add(int &x, int y) { x+=y; if(x>=MOD) x-=MOD; }

void calc() {
    c[0][0] = 1;
    for (int i = 1; i < N; ++i) {
        c[i][0] = c[i][i] = 1;
        for (int j = 1; j < i; ++j) {
            c[i][j] = (c[i-1][j] + c[i-1][j-1]) % MOD;
        }
    }
}

void init(int v) {
    int idx = 0;
    while (v) {
        if (v&1) bit[idx]++;
        v >>= 1;
        idx++;
    }
    up(midx, idx);
}

void cal(int x) {
    for (int i = 0; i < midx; ++i) {
        for (int j = 1; j <= x && j <= bit[i]; j+=2) {
            add(ans[i], (ll)c[bit[i]][j] * c[n-bit[i]][x-j] % MOD);
        }
    }
}

int main() {
    //freopen("in.txt", "r", stdin);
    calc();
    while (~scanf("%d", &n)) {
        CLR(bit, 0); midx = 0;
        for (int i = 1; i <= n; ++i) {
            scanf("%d",&a[i]);
            init(a[i]);
        }

        //for (int i = 0; i < midx; ++i) printf("%d ", bit[i]);printf("
");

        for (int i = 1; i <= n; ++i) {
            CLR(ans, 0); cal(i);
            int res = 0;
            for (int j = 0; j < midx; ++j) {
                add(res, ((1LL<<j)%MOD*ans[j])%MOD);
            }
            //for (int j = 0; j < midx; ++j) printf("%d ", ans[j]);printf("
");
            printf("%d", res);
            if (i != n) printf(" ");
        }
        printf("
");
    }
    return 0;
}
View Code

B题,ys看的,他在那里算了好久,问他看的怎么样,说差不多了,结果敲了好久,终于过了样例,提交,1A

我鼓掌,ys开心的跳起来,仿佛我们真的拿到了牌。

虽然路还有很远,但是还是惊喜于每一次AC,于是无论结果怎样,都…不会后悔。

之后zr在写C,写完了一直过不了样例,我不是很懂,也没办法帮他看,一直再看K题,事实证明那么少过的题,我是真的不行- -

计划明天补完K题。树分治。太弱,竟然没学过。。。

继续努力……

原文地址:https://www.cnblogs.com/wenruo/p/5811544.html