找个下午打了场CF,结果被某uranus吊打......一千多名,过弱。
T1,一眼二分了,后来发现题解是O(1)的hhh
T2,题意精炼一下就是让你找一个串的循环节个数,直接n²枚举.....
T3,给你一个ab串,你依次考虑每个前缀,选择reverse这个前缀或者不操作。输出方案使得最后的字典序最小。
手玩一下就能发现,一定能构造出最小字典序,所有a都在b前面。
具体操作是每个整段的结尾字符那里翻转。
T4,给你10个1e5的排列,你需要从每个中提取连续的一段,使得这十段相同。求方案数。
考虑KMP(????),就是我们线性的扫描第一个串,把它分成若干段十个串都相同的段,这样每段都可以拿公式计算。
第一次交的时候一个中间变量没开long long挂了,太SB了。
T5,题意有点长......就是给你n个人,你要把这n个人两两组队(就是n(n-1)/2次)各一次,每次解决两个任务a,b。
每个人解决a,b问题都有个代价。组队时一人解决一道题,会自动选择总代价最小的解决方案,代价累加到两个人身上。
扫描二维码关注公众号,回复:
3960022 查看本文章
问你这么多次下来每个人的总代价。
把式子min(A + b, B + a)变形一下:min(b - a, B - A) + a + A
然后就比较显然了.....显然可以用前缀和但是我SB的用了树状数组,不过复杂度一样。
贴个考场代码吧。
1 #include <bits/stdc++.h> 2 3 inline void read(int &x) { 4 x = 0; 5 char c = getchar(); 6 while(c < '0' || c > '9') { 7 c = getchar(); 8 } 9 while(c >= '0' && c <= '9') { 10 x = (x << 3) + (x << 1) + c - 48; 11 c = getchar(); 12 } 13 return; 14 } 15 16 typedef long long LL; 17 const int N = 300010; 18 19 LL xi[N], yi[N], dt[N], X[N], ans[N]; 20 int n, pos[N]; 21 22 struct TA { 23 LL ta[N]; 24 inline void add(int i, LL v) { 25 for(; i <= n; i += i & (-i)) { 26 ta[i] += v; 27 } 28 return; 29 } 30 inline LL getsum(int i) { 31 LL ans = 0; 32 for(; i > 0; i -= i & (-i)) { 33 ans += ta[i]; 34 } 35 return ans; 36 } 37 inline LL ask(int l, int r) { 38 if(r < l) { 39 return 0; 40 } 41 if(l <= 1) { 42 return getsum(r); 43 } 44 return getsum(r) - getsum(l - 1); 45 } 46 }cnt, sum; 47 48 int main() { 49 50 int m; 51 scanf("%d%d", &n, &m); 52 LL tot = 0; 53 for(int i = 1; i <= n; i++) { 54 scanf("%lld%lld", &xi[i], &yi[i]); 55 dt[i] = yi[i] - xi[i]; 56 X[i] = dt[i]; 57 tot += xi[i]; 58 } 59 60 std::sort(X + 1, X + n + 1); 61 int xx = std::unique(X + 1, X + n + 1) - X - 1; 62 63 64 for(int i = 1; i <= n; i++) { 65 int p = std::lower_bound(X + 1, X + xx + 1, dt[i]) - X; 66 pos[i] = p; 67 cnt.add(p, 1); 68 sum.add(p, dt[i]); 69 } 70 71 for(int i = 1; i <= n; i++) { 72 int p = pos[i]; 73 ans[i] += sum.ask(1, p) - dt[i]; 74 ans[i] += cnt.ask(p + 1, n) * dt[i]; 75 ans[i] += tot - xi[i] + xi[i] * (n - 1); 76 } 77 for(int i = 1, x, y; i <= m; i++) { 78 scanf("%d%d", &x, &y); 79 ans[x] -= std::min(xi[x] + yi[y], xi[y] + yi[x]); 80 ans[y] -= std::min(xi[x] + yi[y], xi[y] + yi[x]); 81 } 82 83 for(int i = 1; i <= n; i++) { 84 printf("%lld ", ans[i]); 85 } 86 87 return 0; 88 }
当时境况比较尴尬,写出来时发现比赛刚结束68s......
第一次交很SB的把long long用%d输出了。
最后1104名......F题听说很有趣,以后来填。