CF R 682 Engineer Artem [*2000]
考虑奇偶性,显然如果一个偶数与奇数相邻,必然他们不相等。
直接考虑黑白染色,黑点改为奇数,白点改为偶数即可。
时间复杂度 (O(tnm))。
https://codeforces.com/contest/1438/submission/117497127
Edu CF R 89 Two Divisors [*2000]
考虑将每个数质因数分解,再来构造。
如果被分出来的两个因数 (d_1,d_2) 满足 (gcd(d_1,d_2) ot=1),那么他们的和会为 (d imes(frac{d_1}{d},frac{d_2}{d})),其中 (d) 为 (x) 的一个约数,这显然不可取。
所以,我们就有了一个构造方法,当 (x ot =p^k) 时,其中 (pin ext{prime}),无解,而其余情况,固定 (x) 的任意一个质因子 (d),输出 (frac{x}{d^k}),其中 (x) 可被分解为 (a imes d^k(a ot equiv 0pmod d))。
时间复杂度:线性筛 (O(10^7)),单次回答 (O(log x)),总时间复杂度 (O(10^7+nlog x))。
http://codeforces.com/contest/1366/submission/117498343
CF R 223 Sereja and Brackets [*2000]
数据范围 (10^6),考虑 (log) 级别数据结构。
考虑用线段树维护,对于每一段区间,维护三个值,靠左的右括号个数 (l),靠右的左括号个数 (r) 以及当前匹配的括号个数 (ans)。
pushup 时,直接考虑处理每一段接起来后中间可合并的括号。
时间复杂度:建树 (O(nlog n)),询问 (O(mlog n)),总时间复杂度 (O((n+m)log n))。
https://codeforces.com/problemset/submission/380/117713290
Edu CF R 46 We Need More Bosses [*2100]
显然有一个结论是,在同一个边双连通分量的点之间的答案为 (0)。
所以直接对边双缩点,在缩出来的树上求直径即可。
时间复杂度:(O(n+m))。
https://codeforces.com/contest/1000/submission/117848026
Edu CF R 46 One Occurrence [*2400]
大力莫队,(O(nsqrt{n})) 过 (5 imes 10^5) 不是梦。
这个做法很卡,但还是过了。
考虑怎样维护答案,我们考虑求出出现个数为 (1) 的数,并用一个栈维护。
加入很好做,删除呢?
考虑记录出每个数所在栈的位置,把这个数踢出去的同时,把栈顶丢到这个数所在的位置。
这样,对于每一次询问,直接求栈顶的值即可。
时间复杂度:(O(qsqrt{n}))。
https://codeforces.com/contest/1000/submission/117852388
CF R 723 Kill Anton [*2200]
有一个结论,就是答案串必然由连续的字母段组成。
所以,大力枚举连续字母段的组成,即 A
、N
、T
、O
的一个排列。
剩下的,显然要考虑如何配对,又有一个结论,即在前面的字符匹配在原串中前面的相同字符,这样排队一定是最优的。
那么,对组成的序列编号后,对应编号,求逆序对即可。
时间复杂度 (O(24nlog n))。
https://codeforces.com/contest/1526/submission/117721441
CF R 643 Guess Divisors Count [*2600]
精辟乱搞。
显然问出正确答案不切实际,考虑如何问出近似答案。
考虑尽量询问多的约数,所以开一个队列,尽量询问多的约数并统计答案。
在询问了 (22) 次之后,我们可以乐观估计,小于 (850) 的素因数已被询问出来,考虑剩下的数(以下 (p) 表示任意大于 (850) 的素数):
- (1):此时 (d=ans);
- (p):此时 (2 imes d=ans);
- (p^2):此时 (3 imes d=ans);
- (p_1 imes p_2),此时 (4 imes d=ans);
- (p_1 imes p_2 imes p_3),此时你会发现,(850^3 imes 2>10^9),这说明 (ans=8).
考虑对求出的 (d) 做一定的调整,如何调整呢?乘以 (2) 即可,此时发现会完全符合条件。
https://codeforces.com/contest/1355/submission/117991144
ARC 103 B Robot Arms [*2677]
首先考虑如何判无解,容易发现,如果 (x_i+y_i) 的奇偶性有不同的,显然不可能有解。
考虑接下来如何构造,发现 (mle 40) 很有学问,考虑二进制分解一下。
倍增构造,步长设为 (2^k) 幂,每次选择距目标点较远的坐标来跳,容易发现这是一定可行的。
https://atcoder.jp/contests/arc103/submissions/23176829
ARC 103 D Distance Sums [*2836]
考虑如何求 (D_i),显然有一个 DP 式子:
变形一下,得:
那么,我们只要知道 (D_{son}) 与其他常量就可以推出 (D_{fa})。
钦定重心为根,显然此时叶子节点的值最大,从大到小对给定的 (D) 排序,根据每一个点的 (D) 推出他的父亲。
我们只满足了父子之间的关系,所以我们还要在构造完之后跑一遍 (D) 的值,以使得是对的。
https://atcoder.jp/contests/arc103/submissions/23177106
ARC 091 D Strange Nim [*2395]
考虑博弈论,显然可以设 (f(i,j))) 为大小为 (i) 的石子,且 (j) 为常数 (k) 的胜负情况。
如果你很牛逼或者善于打表,那么你可以得到一个结果:
那么,于是你直接暴力模拟,然后 T 了 (4) 个点。
发现在第三种情况中,我们会跳了太多次,所以考虑压一下跳的步数。
然后就没了。
CF R 729 Priority Queue [*2200]
考虑对每个数计算它的贡献。
那么我们需要求出它不被删去的贡献,DP 即可。
设 (f_{i,j}) 表示在前 (i) 个数中,选了多少个替罪羊,分几个情况讨论一下:
- (i) 在当前枚举的数之前:
- 若是一次删除:
- (f_{i,j}=f_{i-1,j}+f_{i-1,j+1})。
- 注意特判 (j=0):(f_{i,j}=2 imes f_{i-1,j}+f_{i-1,j+1})。
- 若是一次添加:
- 若是替罪羊:
- (f_{i,j}=f_{i-1,j-1}+f_{i-1,j})。
- 同样特判 (j=0):(f_{i,j}=f_{i-1,j})。
- 若不是替罪羊,选与不选均可:
- (f_{i,j}=2 imes f_{i-1,j})。
- 若是替罪羊:
- 若是一次删除:
- 若现在转移到 (x),显然 (f_{x,j}=f_{x,j-1})。
- (i) 在之前枚举的数之后,类情况 (1) 不过要做一定的修改:
- 当是删除且 (j=0) 时,(f_{i,j}=f_{i-1,j}+f_{i-1,j+1})。因为如果没有了替罪羊,我们要计算的就会被删去,只好不选。
- 注意到本题有重复的数字,为了避免重复计算,在 (i>x) 时,一个数能成为替罪羊,当且仅当 (a_i>a_x),而不是之前的 (a_ige a_x)。
记得取模。