Codeforces Round #846 (Div. 2)

链接: https://codeforces.com/contest/1780


\(B\)
一个显然但是不会证明的结论是分成段数尽可能少时\(gcd\)会取到极大值,也就是说这道题里面分成两段一定可以取到最大,所以枚举切割点即可。


\(C\)
用堆来维护每次座位的最大值即可。


\(D\)
交互题
题意:
\(30\)次操作内,每次可以减去一个正整数,每次操作后都会告诉我们当前这个数二进制下\(1\)的个数,要还原出原始的数。
解法:
观察发现,如果减去某个\(2^k\)后(即二进制下的\(1000...000\)),\(1\)的个数有可能变多或者不变,也有可能变少,如果变少那就说明当前数在该位是\(1\),否则说明这个位是\(0\),而且可以通过增多的\(1\)的数量来反推当前位置往前多少位才到\(1\)
此时每次操作我们忽略最后的一段连续的\(0\)(因为这个我们一直都会知道),就相当于每次都在最后\(-1\),如果变少那就往前走,否则就\(-1000...000\),其中\(0\)的个数是我们推到出来原来有多少位(设为\(p\))连续的\(0\),上次操作已经\(-1\),所以现在剩下\(p\)\(1\),又考虑到下次勘探操作又要\(-1\),所以将这次消灭操作和勘探操作合并,变成\(-1000...000\),其中有\(p\)\(0\)
这样做我们可以保证一位最多操作\(1\)次,而最坏的情况是\(1010...1010\),也是不会超过\(30\)的。
本题还有其他的理解方法,但是都大同小异,作为一道简单的交互题,还是很有启发意义的。


\(E\)
整数分块,\(gcd\)

题意:
对于\(L\leq i<j\leq R\),有多少个不同的\(gcd(i,j)\).
解法:
本题只需要出现过多少个不同的gcd,不要求出现的次数,所以做到不漏即可,不需要不重复。
参考以下题解:


参考自:
Codeforces Round #846 (Div. 2) A-E
本题还有其他理解方法,但是都是大同小异,本题的整出分块的方法对于莫比乌斯反演也是一个必备知识。

\(F\)
容斥原理,莫比乌斯反演


\(G\)
后缀树组SA,后缀自动机SAM
好像说是SAM的模板题,当然用SA+height数组乱搞也可以。

posted @ 2023-02-08 12:28  从零开始sfcn  阅读(31)  评论(0编辑  收藏  举报