day2

洛谷 P5278 算术天才⑨与等差数列

等差数列的转换:

  1. \(\max a_i - \min a_i = (n-1)k\)
  2. \(\gcd|a_i-a_{i-1}|=k\)
  3. \(\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)\)

这个可以经典维护。

  1. \(mn\) 维护区间的最小值;
  2. \(mx\) 维护区间的最大值;
  3. \(lmx\) 维护 \(\max\limits_{i<j}(p_i−2p_j)\),对应区间内包含 \(l,m\) 的情况;
  4. \(rmx\) 维护 \(\max\limits_{i>j}(p_i−2p_j)\),对应区间内包含 \(m,r\) 的情况;
  5. \(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

posted @ 2025-08-18 21:04  LQ636721  阅读(2)  评论(0)    收藏  举报