codeforeces近日题目小结
Posted ytytzzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforeces近日题目小结相关的知识,希望对你有一定的参考价值。
题目源自codeforeces的三场contest
contest/1043+1055+1076
目前都是solved 6/7,都差了最后一题
简单题:
contest/1043/E:
先不考虑m个限制,求出每个人与其他所有人组队的情况下这个人获得的分数
对于当前的 i ,如果他与 j 组队时 i 做第一题,则有 xi + yj <= xj + yi
即 xi - yi <= xj - yj,排序累加计算即可
contest/1055/C:
注意到 la 与 lb 的差距会由于 t0 和 t1 而变化 k*gcd(t0, t1), k为系数
所以肯定想让 la 和 lb 离得尽量近,重合部分也就越大
能让两个位置重合就重合,不能重合就在那个位置前后蹭蹭就行了
contest/1076/D:
考虑最短路的dij算法,发现那些在最短路上的边形成了一棵树
所以直接跑堆优化dij
contest/1076/E:
kdtree模板题,变成二维空间操作,一维dep,一维dfn
二维空间矩形加+单点查询?考虑差分变为,单点加+前缀和
查询是在所有操作完成后,所以直接把操作和查询混在一起
按照第一关键字x,第二关键字y排序,排序后直接树状数组维护即可
O(nlogn)
思维僵化,有个O(n)做法,使用差分数组 f[ ]
把每个操作(v, d, x)挂到节点 v 上
然后一遍dfs,在到达v的时候对于节点上每个操作
f[dep[v]] += x, f[dep[v] + d + 1] -= x
dfs 回到点 v 父亲之前再做逆操作
对f[ ]求[1, dep[u]]的前缀和即为点 u 的答案
我傻逼了好久的题目:
contest/1055/D:
先对于那些w[i] != v[i]的所有串
求出他们共同的核心替换部分(必须替换并且长度一致)
然后为了不让无辜串也被替换所以要尝试将该串尽量向左右拓展
最后求出来替换串 s -> t 之后再验证,验证一开始想的太简单了
w[i] = v[i]的串,都满足w[i].find(s) == 0是不足够的
还会有别的情况!
简单暴力就是对n个串w[i]都find一下s,第一次找到就替换成 t
然后新串与v[i]对比即可
1 #include <bits/stdc++.h> 2 3 #define lb(x) (x&(-x)) 4 5 typedef long long ll; 6 7 using namespace std; 8 9 const int N = 5010; 10 11 string s = "", t; 12 13 int n, flag[N]; 14 15 string a[N], b[N]; 16 17 int nex[N], l[N], r[N]; 18 19 vector <int> lt; 20 21 void calc_next() { 22 nex[0] = -1; 23 for (int i = 1; i < s.size(); i ++) { 24 int j = nex[i - 1]; 25 while (j != -1 && s[j + 1] != s[i]) j = nex[j]; 26 if (s[j + 1] == s[i]) nex[i] = j + 1; 27 else nex[i] = -1; 28 } 29 } 30 31 void kmp(string &st) { 32 for (int i = 0, j = -1; i < st.size(); i ++) { 33 while (j != -1 && s[j + 1] != st[i]) j = nex[j]; 34 if (s[j + 1] == st[i]) { 35 j ++; 36 if (j + 1 == s.size()) { 37 st = st.substr(0, i + 1 - s.size()) + t + st.substr(i + 1); 38 return; 39 } 40 } 41 } 42 } 43 44 int main() { 45 ios::sync_with_stdio(false); 46 cin >> n; 47 for (int i = 1; i <= n; i ++) cin >> a[i]; 48 for (int i = 1; i <= n; i ++) cin >> b[i]; 49 for (int i = 1; i <= n; i ++) { 50 l[i] = -2, r[i] = -2; 51 for (int j = 0; j < a[i].size(); j ++) { 52 if (a[i][j] != b[i][j]) { 53 if (l[i] == -2) l[i] = j; 54 r[i] = j; 55 } 56 } 57 if (l[i] == -2) continue; 58 if (s == "") s = a[i].substr(l[i], r[i] - l[i] + 1), t = b[i].substr(l[i], r[i] - l[i] + 1); 59 else if (s != a[i].substr(l[i], r[i] - l[i] + 1) || t != b[i].substr(l[i], r[i] - l[i] + 1)) { 60 cout << "NO"; 61 return 0; 62 } 63 lt.push_back(i); 64 } 65 while (1) { 66 int flag = 1; 67 for (int i : lt) { 68 l[i] --; 69 if (l[i] < 0) { 70 flag = 0; 71 break; 72 } 73 } 74 if (!flag) break; 75 char ch = a[lt[0]][l[lt[0]]]; 76 for (int i : lt) { 77 if (ch != a[i][l[i]]) { 78 flag = 0; 79 break; 80 } 81 } 82 if (!flag) break; 83 s = ch + s; 84 t = ch + t; 85 } 86 while (1) { 87 int flag = 1; 88 for (int i : lt) { 89 r[i] ++; 90 if (r[i] >= a[i].size()) { 91 flag = 0; 92 break; 93 } 94 } 95 if (!flag) break; 96 char ch = a[lt[0]][r[lt[0]]]; 97 for (int i : lt) { 98 if (ch != a[i][r[i]]) { 99 flag = 0; 100 break; 101 } 102 } 103 if (!flag) break; 104 s += ch; 105 t += ch; 106 } 107 calc_next(); 108 for (int i = 1; i <= n; i ++) { 109 kmp(a[i]); 110 if (a[i] != b[i]) { 111 cout << "NO"; 112 return 0; 113 } 114 } 115 cout << "YES " << s << ‘ ‘ << t; 116 return 0; 117 }
以上是关于codeforeces近日题目小结的主要内容,如果未能解决你的问题,请参考以下文章
CodeForece 724C Ray Tracing 扩展欧几里得
CodeForece 724C Ray Tracing 扩展欧几里得
CodeForeces 1202D Print a 1337-string(构造)