CF1043

找个下午打了场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 }
AC代码

当时境况比较尴尬,写出来时发现比赛刚结束68s......

第一次交很SB的把long long用%d输出了。

最后1104名......F题听说很有趣,以后来填。

猜你喜欢

转载自www.cnblogs.com/huyufeifei/p/9919073.html
今日推荐