首页 > 代码库 > Codeforces Round #279 (Div. 2) 题解集合

Codeforces Round #279 (Div. 2) 题解集合

终于有场正常时间的比赛了。。。毛子换冬令时还正是好啊233

做了ABCD,E WA了3次最后没搞定,F不会= =

那就来说说做的题目吧= =

 

 A. Team Olympiad

水题嘛= =

就是个贪心什么的乱搞,貌似放A题难了

 

 1 #include <cstdio> 2 #include <algorithm> 3  4 using namespace std; 5 const int N = 5005; 6  7 int cnt[5], first[5], next[N]; 8  9 int main() {10     int n ,i, x, ans;11     int a, b, c;12     scanf("%d", &n);13     for (i = 1; i <= n; ++i) {14         scanf("%d", &x);15         next[i] = first[x], first[x] = i;16         ++cnt[x];17     }18     ans = min(min(cnt[1], cnt[2]), cnt[3]);19     printf("%d\n", ans);20     a = first[1], b = first[2], c = first[3];21     for (i = 1; i <= ans; ++i) {22         printf("%d %d %d\n", a, b, c);23         a = next[a], b = next[b], c = next[c];24     }25 }
View Code

 

B. Queue

这放B题真的合适吗= =

就是模拟啦,但是但是,具体处理好麻烦的说!!!

 

 1 #include <cstdio> 2 #include <algorithm> 3  4 using namespace std; 5 const int N = (int) 1e6 + 5; 6 int S = (int) 1e6 + 1; 7 int T = (int) 1e6 + 2; 8  9 struct edges {10     int next, to;11     edges() {}12     edges(int _next, int _to) : next(_next), to(_to) {}13 }e[N << 1];14 15 int n, tot, first[N];16 int ans[N], cnt;17 int Cnt[N];18 bool v[N];19 20 inline void add_edges(int x, int y){21     e[++tot] = edges(first[x], y), first[x] = tot;22     e[++tot] = edges(first[y], x), first[y] = tot;    23 }24 25 int main() {26     int i, x, y;27     scanf("%d", &n);28     for (i = 1; i <= n; ++i) {29         scanf("%d%d", &x, &y);30         ++Cnt[x], --Cnt[y];31         if (x == 0) x = S;32         if (y == 0) y = T;33         add_edges(x, y);34     }35     v[S] = 1, cnt = 1;36     while (1) {37         for (x = first[S]; x; x = e[x].next)38             if (!v[e[x].to]) break;39         if (x == 0) break;40         v[S = e[x].to] = 1;41         ans[cnt << 1] = S, ++cnt;42     }43     if (n & 1 == 0) {44         v[T] = 1, cnt = 1;45         while (1) {46             for (x = first[T]; x; x = e[x].next)47                 if (!v[e[x].to]) break;48             if (x == 0) break;49             v[T = e[x].to] = 1;50             ans[n + 1 - (cnt << 1)] = T, ++cnt;51         }52     } else {53         for (i = 1; i <= N; ++i)54             if (Cnt[i] == 1) {55                 S = i;56                 break;57             }58         ans[1] = S;59         v[S] = 1, cnt = 1;60         while (1) {61             for (x = first[S]; x; x = e[x].next)62                 if (!v[e[x].to]) break;63             if (x == 0) break;64             v[S = e[x].to] = 1;65             ans[cnt << 1 | 1] = S, ++cnt;66         }67     }68     for (i = 1; i < n; ++i)69         printf("%d ", ans[i]);70     printf("%d\n", ans[n]);71     return 0;72 }
View Code

 

C. Hacking Cypher

正这反着扫两遍,直接判断就好了,报noip高精模写错的一箭之仇!

 

 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4  5 using namespace std; 6 typedef long long ll; 7 const int N = (int) 1e6 + 5; 8  9 ll a, b;10 int len;11 bool ok_a[N], ok_b[N];12 char st[N];13 14 int main() {15     ll tmp, T;16     int i, j;17     scanf("%s", st + 1); len = strlen(st + 1);18     scanf("%I64d%I64d", &a, &b);19     tmp = 0;20     for (i = 1; i <= len; ++i) {21         ((tmp *= 10) += st[i] - 0 ) %= a;22         if (tmp == 0) ok_a[i] = 1; else ok_a[i] = 0;23     }24     tmp = 0, T = 1;25     for (i = len; i; --i) {26         (tmp += (ll) T * (st[i] - 0)) %= b;27         (T *= 10) %= b;28         if (tmp == 0) ok_b[i] = 1; else ok_b[i] = 0;29     }30     for (i = 2; i <= len; ++i)31         if (ok_a[i - 1] && ok_b[i] && st[i] != 0) break;32     if (i == len + 1) {33         puts("NO");34         return 0;35     }36     puts("YES");37     for (j = 1; j < i; ++j)38         putchar(st[j]); puts("");39     for (j = i; j <= len; ++j)40         putchar(st[j]); puts("");41     return 0;42 }
View Code

 

D. Chocolate

第一眼神题Orz

后来发现,是指1 * 1的方格一样多。。。这尼玛是在逗我!

于是计算面积s1, s2,令s1 /= gcd, s2 /= gcd

然后判断s1 * (2 / 3) ^ x1 * (1 / 2) ^ y1 = s2 * (2 / 3) ^ x2 * (1 / 2) ^ y2 是否有非负整数解(x1, x2, y1, y2)且x1, x2; y1, y2中都至少有一个0

乱搞吧2333

 

 1 #include <cstdio> 2  3 using namespace std; 4 typedef long long ll; 5  6 ll a, b, c, d, s1, s2, G; 7 int ans; 8 int cnt[2][2]; 9 10 ll gcd(ll a, ll b) {11     return !b ? a : gcd(b, a % b);12 }13 14 int abs(int x) {15     return x < 0 ? -x : x;16 }17 18 void work() {19     ans += cnt[0][1] + cnt[1][1] + abs(cnt[0][0] + cnt[0][1] - cnt[1][0] - cnt[1][1]);20 }21 22 int main() {23     scanf("%I64d%I64d%I64d%I64d", &a, &b, &c, &d);24     s1 = a * b;25     s2 = c * d;26     G = gcd(s1, s2);27     s1 /= G, s2 /= G;28     while (!(s1 & 1)) s1 >>= 1, ++cnt[0][0];29     while (s1 % 3 == 0) s1 /= 3, ++cnt[0][1];30     while (!(s2 & 1)) s2 >>= 1, ++cnt[1][0];31     while (s2 % 3 == 0) s2 /= 3, ++cnt[1][1];32     if (s1 > 1 || s2 > 1) {33         puts("-1");34         return 0;35     }36     work();37     printf("%d\n", ans);38     cnt[0][0] += cnt[0][1], cnt[1][0] += cnt[1][1];39     if (cnt[0][0] > cnt[1][0]) cnt[0][0] -= cnt[1][0], cnt[1][0] = 0;40     else cnt[1][0] -= cnt[0][0], cnt[0][0] = 0;41     while (cnt[0][1]--) {42         if (a % 3 == 0) (a /= 3) *= 2;43         else (b /= 3) *= 2;44     }45     while (cnt[1][1]--) {46         if (c % 3 == 0) (c /= 3) *= 2;47         else (d /= 3) *= 2;48     }49     while (cnt[0][0]--) {50         if (!(a & 1)) a /= 2;51         else b /= 2;52     }53     while (cnt[1][0]--) {54         if (!(c & 1)) c /= 2;55         else d /= 2;56     }57     printf("%I64d %I64d\n%I64d %I64d\n", a, b, c, d);58     return 0;59 }
View Code

 

E. Restoring Increasing Sequence

字符串处理一下,然后贪心当前最小即可,然后我的bin数组少了个0,WA到死啊!!!

我的Div.2 Rank 10-快还我。。。呜呜呜

 

 1 #include <cstdio> 2 #include <cstring> 3  4 using namespace std; 5 const int bin[9] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; 6 const int N = 100005; 7  8 int n, len, len_last; 9 char st[10];10 int ans[N];11 12 int work(int p) {13     int res = 0, i, j;14     if (len_last > len) return 0;15     if (len_last < len) {16         for (i = 1; i <= len; ++i)17             if (st[i] == ?)18                 if (i == 1) res = 1; else res *= 10;19             else (res *= 10) += st[i] - 0;20         return res;21     }22     for (i = 1; i <= len; ++i)23         if (st[i] == ?)24             (res *= 10) += 9;25         else (res *= 10) += st[i] - 0;26     if (res <= ans[p - 1]) return 0;27     for (i = 1; i <= len; ++i) 28         if (st[i] == ?)29             for (j = 1; j <= 9; ++j)30                 if (res - bin[len - i] <= ans[p - 1]) break;31                 else res -= bin[len - i];32     return res;33         34 }35 36 int main() {37     int i;38     scanf("%d\n", &n);39     ans[0] = 0;40     len = 0;41     for (i = 1; i <= n; ++i) {42         scanf("%s\n", st + 1);43         len_last = len, len = strlen(st + 1);44         if (!(ans[i] = work(i))) {45             puts("NO");46             return 0;47         }48     }49     puts("YES");50     for (i = 1; i <= n; ++i)51         printf("%d\n", ans[i]);52     return 0;53 }
View Code

 

F. Treeland Tour

第一反应是树上DP,每个点一个平衡树维护。。。

后来发现怎么可能,应该是点分治 + 归并数组。。。

但是真的能写的出来?不明= =(话说至今No Tags,什么东西!)

反正Div.2里只有一个人A了F,但是Div.1里A掉的貌似很多啊?以后再说吧

 

于是蒟蒻喜闻乐见的Div.2 Rank 44,被各位神犇D飞啦~Orz跪

Codeforces Round #279 (Div. 2) 题解集合