day2
洛谷 P5278 算术天才⑨与等差数列
等差数列的转换:
- \(\max a_i - \min a_i = (n-1)k\);
- \(\gcd|a_i-a_{i-1}|=k\);
- \(\forall i\ne j,a_i\ne a_j\)。
都可以线段树维护。
CF1149C Tree Generator™
括号序即欧拉序,
()
看作 \(+1/-1\),前缀和 \(p_i\) 即为 \(dep_{i+1}\)。然后由欧拉序上 LCA 知识,\(ans=\max\limits_{l\le r}(d_r+d_l-2\min\limits_{l\le m\le r}d_m)\)。
这个可以经典维护。
- \(mn\) 维护区间的最小值;
- \(mx\) 维护区间的最大值;
- \(lmx\) 维护 \(\max\limits_{i<j}(p_i−2p_j)\),对应区间内包含 \(l,m\) 的情况;
- \(rmx\) 维护 \(\max\limits_{i>j}(p_i−2p_j)\),对应区间内包含 \(m,r\) 的情况;
- \(ans\) 维护当前区间的答案。
ARC069D Flags
二分 \(d\),然后可以转成 2-sat。
线段树建图优化即可。
CF932F Escape Through Leaf
看着比较 dp。
\(f_u=\min{f_v+a_ub_v}\),这就是个关于 \(v\) 的一次函数。
那么放到李超上查询,而这个李超可以从儿子继承,那么 dsu on tree 即可。
ARC104F Visibility Sequence
可以瞪出 \(P\) 到笛卡尔树的双射,所以数树。
\(f(l,r,m)\) 表示 \(l\sim r\) 高度不超过 \(m\) 的方案数,记 \(h_k=\min{m,X_k}\),可以转移:
\(f(l,r,m)\gets f(l,k-1,h_k-1)+f(k+1,r,h_k)\)。
离散化后做就好了。
洛谷 P6453 [COCI 2008/2009 #4] PERIODNI
放车是经典的小根笛卡尔树。
考虑 \(f_{u,i}\) 表示 \(u\) 子树内放 \(i\) 个车,\(g_{u,i}\) 是不能在 \(u\) 的区域内放。
区域的划分是说整棵子树的矩形中小于自身高度的部分,也就是会被自身车影响的部分。
\(g_{u,i}\) 的转移是容易的,结合组合数从 \(g_{u,i}\) 推出 \(f_{u,i}\) 即可。
洛谷 P10919 运输规划
建笛卡尔树,那么每个车可以放给子树的机场。
这是个车和机场的匹配问题,那么有解就可以用 Hall 刻画。
谁说 Hall 不能优化复杂度。维护可用车数量减去机场数量,然后逐个机场安排车,往上二分一下找能承受减一的最小车来。
后半段树剖线段树就好。
洛谷 P5841 [CTSC2011] 字符串重排
好的排列一定能 dfs 过所有字符串,判断这个的基础上逐个收益考虑。
啊我好像掉线了。
洛谷 P11611 [PA 2016] 归约 / CNF-SAT
竟然是考虑逐个数填入吗?
本应是 \(f(i,s)\) 记录不符合条件的串集合,然而会发现如果把串在该位截断,会形成后缀关系,翻转一下就是前缀关系,可以用字典树上的结点表示。
要动态维护字典树,我好像又掉线了。
洛谷 P7011 [CERC2013] Escape
考虑把操作转化成若干 \((x,y)\) 表示付出 \(x\) 得到 \(y\)。
对于 \((a,b),(c,d)\),若 \(a\le c\le b\),那么取了 \((a,b)\) 就必取 \((c,d)\),于是可以合并。
如此执行启发式合并,然后把自己加进去。
在 \(t\) 旁边挂一个 \((0,M)\),那么只需检查根节点有无这样 \((0,\ge M)\) 的策略即可。
洛谷 P5113 Sabbat of the witch
分块,给每个块维护集合 \(S\) 为经历的整块赋值操作,记其中最晚时间为 \(T\)。
散点维护 \(V_i\) 表示经历的散点赋值操作,记其中最晚时间为 \(T_i\)。
对于 \(T_i>T\),称其为自由的,反之为受控的。
不考虑撤销是好做的,撤销时懒删除这个操作。
但是需要求撤销后块和,看着不太好做,但是有一种算典的方法?
注意到块内要么是当前 \(v\),否则按时间排序后自由的点会构成后缀。
而自由的都是由散块修改造成的,于是改散块的时候做一下排序就好。
CF102586 L. Yosupo's Algorithm
直接扫描线会挂,然后外面套个分治,可以把点对压到 \(\mathcal{O}(n\lg n)\) 个。
洛谷 P5044 [IOI 2018] meetings 会议
考虑朴素的 dp 方法是 \(f(l,r)\) 算一段,注意到跨过区间最大值的部分贡献都很不优,于是考虑最优点取在最大值哪侧并分别转移。
即 \(f(l,r)=\min(f(l,x-1)+h_x(r-x+1),h_x(x-l+1)+f(x+1,r))\)。
这个看着就很笛卡尔树啊,我们把问题挂上去。
此时有个好处是我们求的 \(f\) 都是某个 \(x\) 的前后缀,但看着没啥用。
其实是有用的!此时我们分治求两侧 \(f\) 后,往对侧递推的时候,两种取值的修改要么是直接加要么是加一次函数,而且这两种取值的分界可以直接二分找出来。
那么现在用线段树维护就是可行的了!查询的时候再拼一下即可。
洛谷 P6109 [Ynoi2009] rprmq1
CF1110H Modest Substrings
CF1637H Minimize Inversions Number
可以严谨证明对于逆序对 \((i,j)\),不能单选 \(i\),感性一点的理解就是 \(j\) 至少能搬回该逆序对,且增加的不会比 \(i\) 多。
那么原本需要最大化的 \(\sum d_{i_j}-2\operatorname{inv}(q_1,\cdots,q_k)\) 中后者就是一开始 \(i\) 向后构成的逆序对数。
直接求出来排序选。
CF1707F Bugaboo