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 }
View Code

 

以上是关于codeforeces近日题目小结的主要内容,如果未能解决你的问题,请参考以下文章

CodeForece 724C Ray Tracing 扩展欧几里得

CodeForece 724C Ray Tracing 扩展欧几里得

codeforeces GYM 101142 C

CodeForeces 1202D Print a 1337-string(构造)

CodeForeces 842d Vitya and Strange Lesson ——(带lazy标记的01字典树)

Codeforecs H. Subsegments