好
A
第一步很关键,发现一个数可以通过2次操作变成\(2^{k+1}-1\),然后就讨论一下0次还是1次。0次就是seg or sum=\(2^{k+1}-1\)。1次就是改一个包含\(l,r\)的,\(l,r\)是没有的最小/最大位置,考虑前缀后缀对or的贡献,总共只有\(O(\log A)\)个有效段,然后就是一个rmq问题,能用\(O(n)-O(1)\,rmq\)搞成\(O(n\log A)\)的复杂度,实现感觉很差,但是过了。
C
2-sat,有重叠的不能都选,要求的不能都不选,考虑优化重叠的那些建图。
为了避免自己往自己连的情况,用主席树优化建图
将所有区间按左端点排序后,从左往右扫一次连边,为了保证不连自己,需要往前一棵主席树上连。再倒着连一遍边就行了
也可以一颗主席树,可持久化的时间轴对应离散化后的考试时间,线段树的下标轴对应按si排序的n场考试,然后往线段树加边的时候把自己找出来,把区间断成两截加。
E
有一个显然dp,\(f_i\)表示匹配到了第\(i\)个,最小cost是多少,转移是\(f_i=\min_{j<i}\{f_j+c(j+1,i)\}\),考虑如何计算\(c(x,y)\)。
我们肯定是加入了某个串\(s\)的前缀,然后删除不需要的后缀,在删除的时候我们只关心串的长度,不关心加入的是什么串,我们只需要求\(cost_x\)表示删除长度为\(x\)的段需要的最小操作次数。总共有\(O(\sqrt{\sum |s_i|})\)种长度,我们可以直接跑一个同余最短路,可以在\(O(K\log K\sqrt{|s_i|})\)的时间复杂度内求得\(cost_x\)。
然后我们可以把所有的\(s\)放到一颗trie树上,在构造T的过程中肯定是若干个\(s\)的前缀,我们可以预处理出trie树上每个点所需要的最小次数,然后在转移的时候边在trie树上走边转移就好,总复杂度为\(O(K\log K\sqrt{|s_i|}+26\sum |s_i|+|T|^2)\)。
G
前面栈的贪心匹配模型很好想,主要卡在了\(dp\)的时候状态更新,空栈根其他情况不一样。这里可以想到把第一次拿出来单独搞。
复读一下jiangly的题解,首先定义好串是第一个字符在最后弹栈的串,满足题意的串就应该是多个好串拼起来的。设长度为\(2n\)的答案串的生成函数是\(F\),好串的生成函数是\(G\),那么剥掉\(G\)最外层的串,考虑里面应该也是很多个好串拼起来的,但是这些好串最外层的贡献不是\(c\)而是\(c-1\),因此乘个系数修正一下,\(G=cx\frac 1{1-\frac{c-1}cG}\),根据\([x^0]G=0\)稍微看一下求根公式的加减号,算出来\(G=\frac{c-c\sqrt{1-4(c-1)x}}{2c-2}\),然后F是G拼起来,\(F=\frac 1{1-G}\),把\(G\)扔进去根号翻上来,\(F=\frac{c-2-c\sqrt{1-4(c-1)x}}{2c^2x-2}\),然后根号用泰勒\(\sqrt{1+x}=1+\frac 12x+\sum_{k=2}^{+\infty}\frac{(-1)^{k-1}(2k-3)!!}{k!2^k}x^k\)往里面代一下,分式下面的分式用\(\frac 1{1-x}=\sum_{k=0}^{+\infty}x^k\)换一下,只算\(F\)的\([x^n]\)一项是\(O(n)\) 的。
H
场上看成只能投父亲和父亲的父亲了(x
钦定一个点考虑能不能win,显然子树中所有点都投他,考虑其他点,有一个经典dp,\(f_{t,i}\)表示最多被投\(t\)票,最少多出几票往上投,包含自己。
显然\(f_{t,1}\)的值是关于\(t\)单调的,我们找到最小的\(t\)使得\(f_{t,1}=0\)。记\(sz_x\)为能投\(x\)点的个数,如果某个点\(x\)有\(sz_x>t\),这个点显然是可以满足的。如果\(sz_x < t\),则\(f_{t,x}=1\),这个点的子树对于上面是没有影响的,所以上面该爆的还是爆,这个点最多\(t-1\)票,是干不过上面的。
如果\(sz_x=t\),我们就需要让其他所有点的票数\(< t\),考虑在什么情况下能够满足。实际上这种情况相当于把\(f_{t-1,x}\)变为1,然后再考虑这个改变对上面的影响,如果这个子树不是一个菊花,其原本的\(f_{t-1,x}=1\),其对上面没有影响,故上面该爆还是爆,所以我们只需要考虑菊花的子树,也即\(f_{t-1,x}>1\)的。然后再考虑往上传的过程中被拦截了,也就是存在某个祖先\(y\),\(f_{t-1,y}=1\)只有自己对上面有贡献,这种情况下\(y\)往上的\(f\)值是不变的,所以上面该爆的也照样爆,不满足,所以祖先上除了根的\(f\)不能为\(1\)。我们最多把\(f\)值减1,故\(f_1\)必须为1。然后都考虑一下写出来就好。
I
jiangly说的差不多,粘一下:
从左往右扫描线,在每个圆的左端点处加入,右端点处删除。加入圆时,从它的左端点开始向和它 \(y\) 坐标相邻的一个圆连一条竖直线。注意 \(x\) 坐标相同时应该先加入再删除,并且同时加入的要特殊处理,防止连的线和其他圆相切。
现在我们形成了若干个 \(x\) 坐标不相交的连通块,把相邻的连通块的最右端和最左端连起来即可。
还要注意题目要求输出的坐标范围在 \([0,10^9]\),其实我们只需强行让每个圆的左右端点在这个范围内即可(注意这个做法实际上对任何凸的图形都有效,限制范围相当于直接把圆切掉一部分)。
时间复杂度 \(O(N\log N)\)。
补充一下,加入\(set\)的时候,同一个坐标的点要按照\(y\)排序加,有一部分可能要倒着加,总之需要小心的维护竖线的\(y\)区间不要重叠。维护连通块不用最后单独做,扫描线删的时候如果\(set\)为空记录一个\((lx,ly)\)当作尾巴,然后加的时候如果\(set\)为空就连一下前面记下的尾巴。
M
场上构造了好久,还好最后构造出来了,这种题怎么想快一点啊。。。
有一个显然的上界是\(k\le \frac{n}{2}\),考虑怎么构造,只需要构造\(2k=n\)的情况就好,其他情况直接往外加边就好。
先把点分成2列,每列\(k\)个点,我们要充分利用\(k\)个点之间的边和两列之间的边,注意到\(k\)为奇数时,\(k\)个点的完全图上的边是可以均分的,那就直接均分,然后用之间的边去不足没有连的,用这个思路就可以构造出来。然后\(k\)为偶数时,完全图上的边不能均分了,手玩一下发现前一半点多后一半点少,再中间的边前一半少后一半多,刚好能构造出来,反正就酱,差不多。