嘴巴记录II
作者:互联网
状态不佳时会嘴巴,题目来源非常随机。
CF1603D Artistic Partition
我们发现 \(c(l,r)\) 当 \(l=x,r=2x-1\) 时,一定等于 \(r-l+1\) ,所以如果 \(n<2^k\) ,那么一定是可以拆分成若干段满足上面要求的式子的,所以我们只需要考虑 \(n>2^k\) 的情况,即 \(k\) 我们只需要处理 \(O(\log_2n)\) 级别的答案。
考虑到 \(c(l,r)\) 是满足四边形不等式的,所以我们干脆考虑暴力求解 \(\log_2n\) 个 \(k\) 的答案。
现在的问题是如何快速求出 \(c(l,r)\) ,考虑推式子:
\[c(l,r)=\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)\ge l]\\ =\sum_{i=l}^r\sum_{j=i}^r\sum_{k=l}^r[\gcd(i,j)=k]\\ =\sum_{k=l}^r\sum_{i=1}^{ik\le r}\sum_{j=i}^{jk\le r}[\gcd(i,j)=1]\\ =\sum_{k=l}^r\sum_{i=1}^{ik\le r}\varphi(i)\\ \]维护一波 \(\varphi(x)\) 的前缀和即可。
然后做完了!!!
CF1363D Guess The Maximums
首先一个全部查询可以让我们获得全局最大,但是我们需要找到这个全局最大的位置,所以我们要二分查找。
然后对于不包含这个全局最大位置的集合,我们实际上已经得到答案了,然后查询一下剩下的最大即可。
为什么这种题也能进我的任务计划。
CF700D Huffman Coding on Segment
我们回忆一下哈夫曼编码,其是自底向上建树,每次合并最小的两个子树。
我好像没啥想法。考虑能否在已有哈夫曼树上加入一个数并维护。。。
考虑我们可以使用莫队维护每一个数出现的数量,我们现在需要考虑的是如何快速求出他的哈夫曼树的权值。
我们考虑到出现的数的数量的和是为区间的长度的,所以这启发我们使用根号分治。
我们令设定一个上界 \(B\) ,超过 \(B\) 的我们直接考虑用堆做,不超过 \(B\) 的我维护出一个桶 \(b_i\) 表示出现次数为 \(i\) 的数有几个,考虑扫一遍这个桶并合并,如果合并之后超过了 \(B\) 就丢到堆里。
可以发现丢到堆里的数的个数还是 \(\frac{n}{B}\) 级别的,因为 \(\sum i\times b_i=n\) 始终是定值。
我们取 \(B=\sqrt{n\log_2n}\) 可以达到最优复杂度。
AT3954 [AGC023C] Painting Machines
首先涛神搞出了一个式子:
\[\text{res}=\max_{i=1}^n\min(t_i,t_{i+1})\\ \]其中 \(t_i\) 表示每一个操作的出现时间。
我们考虑算出前 \(i\) 步覆盖完全的排列数量 \(f_i\) ,然后我们的答案必然可以通过这个 \(f_i\) 求得。
然后考虑到实际上这个排列的数量只和我们前 \(i\) 步选了哪些位置有关,所以我们可以设 \(g_i\) 表示选择 \(i\) 个位置能够覆盖满的集合数量,可得 \(f_i=g_i\times i!(n-i-1)!\) ,意为 \(i\) 个被选择的元素的位置可以随意调换,剩下元素的位置也可以随意调换。
我们再来考虑求这个 \(g_i\) ,我们要使得其中的元素有 \(1,n-1\) 且相邻的元素的差不能超过 \(2\) 。
由于差不能超过 \(2\) ,相当于我们就是需要选出 \(k\) 个差作为 \(2\) ,剩下 \(i-1-k\) 个作为 \(1\) ,同时满足和是 \(n-2\) 。
\[2k+(i-1-k)=n-2\\ k=n-1-i\\ \]所以方案数就是:
\[g_i=\binom{i-1}{n-1-i}\\ \]然后我们考虑再用 \(f_i\) 计算出答案,即
\[\text{res}=\sum_{i=1}^{n}(f_i-f_{i-1})i \]然后做完了。
P7828 [CCO2021] Swap Swap Sort
感觉这题可以从两个角度思考,一个是逆序对的角度,另一个是交换之后的贡献的角度。
如果从逆序对的角度,我们需要快速求出交换的两个元素所构成的逆序对的数量,或许不需要快速,因为交换只进行 \(O(q)\) 次,我们可以预处理。
具体是用根号分治预处理:
- 如果两个数的出现次数都小于根号,暴力做即可。
- 如果存在一个数的出现次数大于根号,我们就预处理好其前缀和,同时暴力扫一遍其余所有数的答案,此过程不会超过根号次。
然后就好了。
P2336 [SCOI2012]喵星球上的点名
好像我可以直接嘴巴掉?
直接考虑将所有喵星人的串的所有后缀和询问串混在一起排序,然后就是一个区间数颜色的问题了!!!
P3265 [JLOI2015]装备购买
给我一种线性基的感觉,但是我们要使得装备花的钱最少。
我们直接考虑从小到大的价格维护即可?
P7824 「RdOI R3」毒水
这不就是一个二分查找吗?假设我们没有变异鼠。
类似于这样的,以 \(16\) 瓶毒水举例:
0000000011111111
0000111100001111
0011001100110011
0101010101010101
我们直接可以通过这种方式(即二进制)来获得哪瓶是有毒的。
但是存在一个变异鼠,而且变异鼠会给我们相反的信息。也就是如果我们询问的鼠中存在变异鼠,我们必然不能正确作答。所以我们还需要通过剩下的 \(6\) 只老鼠找到这只变异鼠,或者得出变异鼠不在我询问的老鼠中的结论。
我们意识到我们可以通过将两次询问的询问区域异或,这样我们也能得到两次询问的答案异或。
而异或运算存在一个优点就是只改变其中一个的值是一定错的。
我们就考虑将相邻三个的配对进行异或查询,花费了 \(3\) 只老鼠。
考虑再将 \(1,4,7\) 异或检测,\(2,5,8\) 异或检测,\(3,6,9\) 异或检测,花费了 \(3\) 只老鼠。
我们发现我们是可以利用上面的检测判断出变异老鼠的位置的。
如果 \(6\) 次检测中只错了一个,那么必然是检测的老鼠是变异鼠,不然如果错了两次,找到错的交集即可判断变异鼠位置。
CF1535F String Distance
首先如果可行答案最大就是 \(2\) ,所以我们只需要判断是否是 \(1\) 以及是否可行。
可行非常好判断,字符集不相同一定不可行,这是充要的。
判断是否是一的话相当于就是两个串需要满足他们存在一定的前后缀相同,且剩下部分其中一个串是有序的。
所以说我们已经有了一个快速判断是否是 \(1\) 的方法,找出两个串的最长公共前后缀,查看剩下部分是否是一个有序的。
首先判断串是否相同的话我们就直接暴力排序加哈希搞就行了。
有一个很关键的点没有发现,就是如果中间部分是有序的,那么他一定是位于跟他有着相同最长前缀的串的第一个(在经过排序后)。
所以我们直接利用单调栈来维护 \(\text{lcp}\) ,现在的问题就是怎么找出这个极大有序子区间呢?我们可以预处理每一个子序列的有序区间的分界点,然后二分找到即可,我竟然没有想到。
然后我们现在又需要统计出相同末尾的位于这段相同 \(\text{lcp}\) 区间的字符串个数,这个直接每一个串反向塞入一个 \(\text{trie}\) 上,每一个节点储存过该点的字符串编号,然后查询的时候记录一下位置,在对应节点上二分即可。
咕咕咕。
AGC056D Subset Sum Game
CF1466H Finding satisfactory solutions
这就是 *3300 吗?完全不会做。
不是很能理解 \(\forall i\in S,a'_i\in S\) 的意义在何。
不过我们依据这个条件的话,似乎只有置换环才能作为一个集合 \(S\) 。
意思就是说,不存在一个置换环被完全吊打,完全吊打指存在一个位置优的情况下,其他位置严格不劣。
我们干脆先来考虑暴力一点的做法,如果暴力枚举置换环,实际上我们就可以得到这个环对应的方案了,然后我们实际上只需要让题目给的 \(a_i\) 比置换环的 \(a'_i\) 均不劣或者存在一个位置劣其余随意就行了,然后我们就可以求出这个置换环的方案数,然后跑一个状压就行了。
但是我们暴力枚举置换环是 \(O(n!)\) 的,而且后面的状压是 \(O(2^n)\) 的,这个复杂度我们是不能接受的。
发现理解错题目了,感觉这个题目的题面巨难理解。
不是置换环,意思是对于一个任意一个非空子集,不能通过集合内部的调换使得出现完全吊打。
我们不妨让每一个人都先向自己最喜欢的物品连边。
先跳这题了,有点懵。
标签:记录,一个,sum,我们,II,变异,异或,考虑,嘴巴 来源: https://www.cnblogs.com/Point-King/p/15673432.html