WC2023(授课与讨论2)
Hammer to Fall
定义\(f_{i,j}\)表示\([i,q]\)天中点\(j\)的答案,则\(f_{i,j}=\begin{cases}f_{i+1,j}&j\ne b_{i}\\\min_{(j,k)\in E}(f_{i+1,k}+w_{(j,k)})&j=b_{i}\end{cases}\)
注意到每次仅修改\(f_{i,b_{i}}\),并对度数分治即可
具体的,用set维护相邻度数\(\le K\)的点,并暴力枚举度数\(>K\)的点即可
取\(K=\sqrt{\frac{m}{\log n}}\),时间复杂度为\(O(q\sqrt{m\log n})\)
Partial Virtual Trees
将\(\subset\)容斥为\(\subseteq\),即需对\([1,n)\)求出答案
记以\(i\)为根的子树点集为\(S\),定义\(f_{i,j}\)表示满足\(T_{0}=S\)且\(T_{j}=\empty\)的虚树序列数,则
(枚举最小的\(t\)满足\(i\not\in T_{t},\)并对至多一个\(>t\)的子树分类讨论)
由于\(1\)一直存在,\(\forall son\in 1\)的子树间独立,即\(k\)时的答案为\(\prod_{son\in 1}f_{son,k}\)
将其中\(f_{son,j}\)相关的项提出后即可优化,时间复杂度为\(O(n^{2})\)
Defend City
参考这里
Flower's Land
考虑点分治,即钦定连通块包含根节点
在dfs序上dp,即\(f_{i,j}\)表示dfs序中前\(i\)个点选\(j\)个的最大点权,转移即\(f_{i,j}\rightarrow \begin{cases}f_{i+1,j+1}(+a_{i})\\f_{i+sz_{i},j}\end{cases}\)
注意到转移为DAG,包含\(k\)即钦定经过\((k,*)\),分别处理以其为起点/终点的最长路即可
由于点集\(<k\)时可以直接退出,时间复杂度为\(O(nk\log\frac{n}{k})\)
Counting Sequence
取最大的\(K\)满足\(\frac{K(K+1)}{2}\le n\),并对\(a_{1}\)分类讨论:
-
若\(a_{1}\le K\),则\(\max a_{i}\le 2K\)
定义\(f_{i,j}\)表示\(a_{1}=i\)且和为\(j\)的方案数,转移即\(f_{i,j}=\sum_{d\in \{1,-1\}}c^{[d=-1]}f_{i+d,j-(i+d)}\)
其中\(i\)的一维具有单调性,且仅需存储最后\(2K\)行,空间复杂度为\(O(n)\)
-
若\(a_{1}>K\),则\(m\le K\),即不需要考虑\(>0\)的限制,可以差分统计每个\(\pm 1\)的贡献
定义\(g_{i,j}\)表示\(m=i,a_{1}=0\)且和为\(j\)的方案数,转移即\(g_{i,j}=\sum_{d\in \{1,-1\}}c^{[d=-1]}g_{i-1,j-d(i-1)}\)
时间复杂度为\(O(n\sqrt{n})\)
黑白点
引理:对于顺时针四个点\(abcd\)(颜色为黑黑白白),则\(a-d,b-c\)劣于\(a-c,b-d\)
结论:任取线段\(a-b\),记\(c,d\)为\(a,b\)顺时针下一个同色点,则有线段\(c-d\)
(上述性质可以自行画图+分类讨论证明)
记线段两侧分别有\(b_{l},w_{l},b_{r},w_{r}\)个黑/白点,即有\(\min(b_{l},w_{r})+\min(b_{r},w_{l})\)个交点
注意到\(b_{l}+b_{r}=w_{l}+w_{r}\),原式即\(\frac{1}{2}\min(b_{l}+w_{l},b_{r}+w_{r})\),也即两侧点数
设\(n\)个黑/白点位置分别为\(b_{i},w_{i}\),则答案即\(\max_{d}\sum dis(b_{i},w_{i+d})\)
分别统计\(b_{i}\)和\(w_{i}\)对\(d\)的贡献,至多分成四段差分即可,时间复杂度为\(O(n)\)
Tree Distance
考虑点分治,记\(S\)为当前点集\(,d_{x}\)为\(x\)到重心的距离,则贡献即\(\min_{x,y\in S\cap [l,r]}(d_{x}+d_{y})\)
可以看作最小值+次小值,而前者必然是\(S\)中后者左/右侧第一个比其小的元素
换言之,仅需考虑\(\sum |S|\sim O(n\log n)\)个点对,做二维偏序即可,时间复杂度为\(O(n\log^{2}n+m\log n)\)
神隐
参考这里
Proposition Composition
记\(S_{i}\)为覆盖\((i,i+1)\)的非链边,则有以下情况:
- 删除某条\(S_{i}=\empty\)的\((i,i+1)\)(和其他任意一条边)
- 删除\((i,i+1)\)和\(S_{i}\)中的边(要求\(|S_{i}|=1\))
- 删除\(i\ne j\)且\(S_{i}=S_{j}\)的\((i,i+1)\)和\((j,j+1)\)
前两种情况是简单的(注意去重),下面考虑第\(3\)种情况:
对每个位置维护\(pre_{i}\)和\(nex_{i}\),表示向前/向后第一个满足\(S_{i}=S_{j}\)的\(j\)
此时,操作即将\(\forall i\in [l,r],pre_{i}<l\)或\(nex_{i}>r\)处断开并连接若干\(pre_{i}\)和\(nex_{j}\)
-
关于断开,注意到总次数为\(O(n)\),用线段树维护即可
-
关于连接,给每条链一个编号,并将断开的位置按编号排序即可
求点所在链的编号可以用启发式分裂,即将较小的部分重新编号
时间复杂度为\(O(n\log n)\)
Anti-median
参考这里
和平共处
参考这里
Good Game
显然操作等价于每次删除极长且长度\(>1\)的\(01\)段
将所有极长段取出,并按长度是否\(>1\)转换为新的\(01\)串
每次删除一个\(1\),相邻两数合并后必然为\(1\),注意到这可以看作删除这两数
换言之,每次删除某个\(1\)(除两端外)的相邻两数,使序列全为\(1\)
-
若\(n=2k-1\),记\(x,y\)为\([1,k]\)和\([k,n]\)中最靠近\(k\)的两个\(1\)(不存在则为\(1\)或\(n\))
注意到至多操作\(k-1\)次,且每次删除\((x,y)\)中的\(0\)均需删除\([x,y]\)外的一个数,化简得\(y-x<k\)
在此基础上,对\(y\)操作\(k-x\)次,即可使\(x\)在中间,进而对其操作剩余\(x-1\)次即可
-
若\(n=2k\),考虑最后剩下的两个\(1\),显然所影响范围不交
换言之,合法当且仅当能将整个序列分为两个长度为奇数的合法段,显然容易判定
时间复杂度为\(O(n)\)