d1t1
我一眼看过去打了一个倍增+树链剖分+线段树\(3log\)大力写过
然后静静思考一下,发现\(dfs\)序上线段树一个\(log\)完美解决
每次修改子树,把每个位置上赋成深度最深的值
d1t2
二分+线段树
二分答案,每次假设答案是\(1-mid\)中的数字
然后我们把这些数字在线段树中全部变为\(1\),其他数字变为\(0\)
那么排序只要根据升序降序把区间中所有\(1\)放到最前面或最后面
然后检查\(q\)位置是否是\(1\)
d1t3
只能更改一个数字,我们先想一个\(n^2\)的大力\(dp\)
设\(f[i]\)表示\(1-i\)中最长不下降子序列的长度
\(f[i]=f[j](i<j,a[i]\ge mx[j],mn[i]\ge a[j])\)
我们发现后这是个三维偏序。。考虑一下\(cdq\)分治
每次右边的位置用左边位置的最大值来更新
d2t1
我们把横着的能影响的连通块和竖着的能影响到的联通块都标上号
每个能放炸弹的点对应着两个编号,在他们之间连边
然后跑二分图最大匹配,答案是最大匹配数
数据范围明示
d2t2
斯特林数不会,鸽子了
d2t3
先搞一波\(SA\)出来
我们容易发现答案有单调性,二分一波答案
然后根据\(height\)数组的定义,我们发现对于某个长度\(len\),以\(c\)开头的符合条件的子串的排名是一段连续的区间
这段区间我们可以用二分+\(st\)表\(O(logn)\)找出来
那么问题变成:排名在某段连续区间内,且下标在某段连续区间内有没有符合要求的子串
二维偏序问题,可以拿主席树草掉
我们还可以二分之后把问题看作\(s[c……c+mid-1]\)有没有在\(s[a……b]\)中出现过
那么我们找到前缀\(s[c+mid-1]\)对应的那个节点,倍增跳到\(parent\ tree\)上第一个\(len\ge mid\)的节点
然后康康这个节点的\(endpos\)集合中有没有\([a+mid-1,b]\)中的数字
\(endpos\)集合用线段树合并维护