【组队训练】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\n", (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; }
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\n", (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("\n"); 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("\n"); printf("%d", res); if (i != n) printf(" "); } printf("\n"); } return 0; }
B题,ys看的,他在那里算了好久,问他看的怎么样,说差不多了,结果敲了好久,终于过了样例,提交,1A
我鼓掌,ys开心的跳起来,仿佛我们真的拿到了牌。
虽然路还有很远,但是还是惊喜于每一次AC,于是无论结果怎样,都…不会后悔。
之后zr在写C,写完了一直过不了样例,我不是很懂,也没办法帮他看,一直再看K题,事实证明那么少过的题,我是真的不行- -
计划明天补完K题。树分治。太弱,竟然没学过。。。
继续努力……