SD 四轮省集

Day 1

模拟赛 T1

给一棵 \(n\) 个点的树。定义 \(f(l,r)\) 为最小的包含编号 \(l\sim r\) 的点的连通块大小。\(q\)\(L,R\) 询问 \(\sum_{L\leq l\leq r\leq R}f(l,r)\)

\(n\leq 10^5,q\leq 5\times 10^5\)

注意到 \(l\sim r\) 的连通块就是 \((l,l+1),(l+1,l+2),\cdots,(r-1,r)\) 这些链的并的大小。于是转化成了二轮省集 D7T1。\(O(n\log^2n+q\log n)。\)

模拟赛 T2 P8425

考虑转化成二维平面,把每个数看做点 \((i,p_i)\)。可以发现整个平面的四个角上必定有一个数,那么考虑填数的过程,就是删掉一个边界的 L 形区域。考虑 DP,设 \(f_{x,y,l}\) 为当前剩下以 \((x,y)\) 为左上角,边长为 \(l\) 的矩形的最小代价,是 \(O(n^3)\) 的。

跑一下随机对拍发现答案很大,也就是说不变的位置很少。实际上可以证明不变的位置是 \(O(\sqrt n)\) 级别的,不超过原序列的 LIS + LDS长度。所以考虑对着不变的位置 DP。

\(f_{i,d,l}\) 表示以 \((i,p_i)\) 为角,\(d\in\{0,1,2,3\}\) 往四个方向延伸,边长为 \(l\) 的正方形的最多不变的位置数。转移是二维偏序,可以 \(O(n^2\log n)\) 解决。d

继续考虑不变的位置,如果将其放在状态上那运用就最大化了。所以交换 DP 的值和状态。设 \(f_{i,d,j}\) 为以 \((i,p_i)\) 为角,方向为 \(d\),已经有 \(j\) 个不变的位置的最大边长。

写一下转移,假设目前要算 \(f_{i,0,j}\),从 \(f_{i',0,j'}\) 转移过来,\(0\) 为左下,那么那个正方形必须包含 \((i,p_i)\)。看上去是个三维偏序,但是如果斜着劈开就能转化成二维偏序。于是转移一次要跑 \(2\times 4=8\) 遍二维偏序。时间复杂度 \(O(n\sqrt n\log n)\),可以通过。

JOISC 2018 B

考虑建模成图。把每条线段和中间正方形的四个角看成点,两两算出距离连边,经过中间正方形的不要。转化成在这张图上求一个能围住 \((0,0)\) 的最小环。判断一个点是否在图形内部可以引一条射线,交点个数为奇数即在图形内部。所以 Floyd 求最小环的过程中额外记一维表示奇偶性即可。\(O(n^3)\)

CF1148H

考虑扫描线扫右端点,同时维护每个左端点对应的 \(\operatorname{mex}\) 咋做。首先知道这个值是随着左端点往左单调不降的,右端点处加入一个值 \(x\) 的时候,只有 \(\operatorname{mex}=x\) 的一段左端点区间的 \(\operatorname{mex}\) 会变化,所以把这一段提出来,设为 \([l,r]\)

\(x+1\) 开始从小到大考虑能不能成为 \(\operatorname{mex}\)。设考虑到 \(v\)\(pos_v\) 为其出现的最靠后的位置。若 \(pos_v\geq r\),则这一段的 \(\operatorname{mex}\) 都大于 \(v\)。若 \(pos_v<l\),则这一段的 \(\operatorname{mex}=v\)。若 \(pos_v \in[l,r)\),则这个区间要分裂开成两个部分。其中 \((pos_v,r]\)\(\operatorname{mex}=v\),然后转化为 \([l,pos_v]\) 的子问题。给 \(pos_v\)\(v\) 为下标建线段树,可以线段树二分快速跳过第一种情况。第三种情况,类似颜色段均摊,修改次数是线性的。于是可以在 \(O(n\log n)\) 的时间内维护出每个 \(\operatorname{mex}\)

然后考虑这个题的询问咋处理。刚才的修改过程可以看作 \(O(n)\) 个带颜色的矩形,那就是静态 4-side 矩形加矩形求和。先把查询差分成 3-side 矩形,然后把修改差分一下,只在上下边界处统计贡献,那贡献就是关于纵坐标的一次函数,拿主席树维护一下,做到 \(O(n\log n)\)

Day 2

模拟赛 T1

给定两个 \(n\) 的排列 \(a,b\),有 \(q\) 次两种操作:

  1. \(a_i'=a_{b_{a_i}}\),然后令 \(a_i\leftarrow a_i'\)
  2. \(b_i'=b_{a_{b_i}}\),然后令 \(b_i\leftarrow b_i'\)

所有操作结束后,输出最终的两个排列的值。

\(n,q\leq 10^5\)

手动模拟发现最终 \(a\) 的答案一定是 \(abab\cdots baba\) 复合,\(b\) 一定是 \(baba\cdots abab\) 复合。所以考虑计算复合的次数,最后统一处理。设 \(ka,kb\),初始为 \(1\)。则 \(1\) 操作就是 \(ka\leftarrow 2ka+kb\)\(2\) 就是 \(kb\leftarrow 2ka+ka\)

考虑怎么计算。不妨先把两个排列搞成一个排列 \(p\),满足:

\[p_i= \begin{cases} a_i+n,&1\leq i\leq n\\ b_{i-n},&n<i\leq 2n \end{cases} \]

然后找出这个排列的所有置换环,只有 \(O(\sqrt n)\) 个本质不同的置换环,把 \(ka,kb\) 对这 \(O(\sqrt n)\) 个长度取模算就行了。\(O(n\sqrt n)\)

模拟赛 T3

给定一棵 \(n\) 个点的树,再给定树上 \(m\) 个红/蓝关键点。若一个关键点下标区间满足任意一个红点都存在一对蓝点使其在这条路径上,那么这个区间合法。对于每个左端点求出合法的最大的右端点。

\(n,m\leq 10^5\)

考虑把区间合法的条件拆到每一个红点 \(i\) 上(虽然一开始就是在每一个点上),找出所有会导致不合法的区间(当然要找合法的也行)。首先这个区间必须包含 \(i\),然后分讨不合法的情况。

找到小于 \(i\) 的第一个蓝点 \(l_1\),再找到小于 \(l_1\) 且与 \(l_1\) 不在一棵子树内的蓝点 \(l_2\)\(r_1,r_2\) 同理。

那么区间 \([l_2+1,l_1]:[i,r_1-1]\)\([l_1+1,i]:[r_1,r_2-1]\) 不合法。如果 \(l_1\)\(r_1\) 在同一子树内,那 \([l_2+1,i]:[i,r_2-1]\) 也不合法。

不合法的区域可以被描述成平面上的矩形。要求的最大的右端点可以在扫描线的时候维护。

现在的问题就是怎么找出那几个点。\(l,r\) 对称,只考虑 \(l\)\(l_1\) 是好求的,\(l_2\) 除掉 \(l_1\) 子树的区间即可。

复杂度 \(O(n\log n)\)

CF1648D

关键在于第二行走的区间是哪个,考虑 DP。设 \(f_i\) 表示从 \((1,1)\) 买下来第 \(i\) 个区间且走到第 \(i\) 个区间的结尾的最大价值。可以线段树优化一下转移。但是这会造成一个问题就是只买一个区间会算错。于是现在要对于一个区间 \([l,r]\)\(l\leq i\leq j\leq r\)\(a_i+b_j\) 最小值,直接拿线段树维护一下就行。

Day 3

模拟赛 T1

给定一张无向图无重边自环,A 和 B 玩游戏。A 初始位于节点 \(1\),要走到节点 \(n\),走一条边耗时 \(1\)。B 可以执行恰好一次操作:在任意时刻将任意一条边断掉。断边之后 A 会立刻接到通知。A 想最小化时间,B 想最大化,求最终的时间。

\(n\leq 2\times 10^5\)

贪心没前途,考虑 DP。设 \(f_u\) 表示以 \(u\) 为起点的答案,\(g_u\) 表示断开 \(u\) 相邻的一条边后 \(u\)\(n\) 的距离最大值,则:

\[f_u=\max\{\min_v\{f_v\}+1,g_u\} \]

若求出 \(g_u\) 则可以用 Dijkstra 转移出 \(f_u\)。要求 \(g_u\),先求出原图以 \(n\) 为根的最短路树,则断开的边必然是 \(u\) 到父亲的边,于是 \(g_u\)\(u\) 到其子树内一点 \(v\) 的距离 \(+1+v\) 走一条非树边到的点 \(w\)\(dep_w\)。可以拆贡献使用数据结构维护。

模拟赛 T2 CF1510H

数轴上给定 \(n\) 条线段,满足只有相离或包含关系且没有重合的端点。现在要在每个线段内选出一个子线段,满足所有的子线段不交(端点可以重合),最大化子线段长度之和。

\(n\leq 5\times 10^5,1\leq L_i<R_i\leq 10^9\)

线段只有包含关系,也就是说可以搞成一棵树。那么考虑当前节点的区间填在哪,可以是边界、儿子之间的空隙、儿子区间里面的任意一个。于是可以设 \(f_{u,i,0/1,0/1}\) 表示 \(u\) 子树内选 \(i\) 条线段,左右端点旁边的空隙有没有被选的最大值。

复杂度看似不能套用树形背包,但是注意到如果 \(i>2siz_u\),则一定能填满。所以 \(i\in[siz_u,2siz_u]\),于是复杂度是树形背包的 \(O(n^2)\)

模拟赛 T3

给定一个字符串 \(s\)\(q\) 次询问区间 \([L,R]\),在这个区间内选出一个子区间 \([l,r]\) 进行操作,最大化原字符串的最长回文串长度。操作是,选定一个 \(k\),将所有字母 \(c\) 变成 \(c-k\bmod |\Sigma|\)

\(n,q\leq 10^5,|\Sigma|\leq 26\)

考虑枚举所有可能的回文中心,哈希 + 二分求出要操作的唯一一个区间,然后数点。做完了。

Day 4

模拟赛 T1

有一棵 \(n\) 个节点的树,每个节点上有一只老鼠,同时每个节点有 \(p\) 的概率存在一个洞,\(1\) 节点为根且一定有洞。每个时刻所有老鼠走到其父亲节点上,如果这个节点上存在一个洞,那么老鼠会在下次行动的时候钻进洞里,如果有两只老鼠在同一时刻在两个节点上,则会被猫抓住。定义一种情况的分数是,若存在老鼠被猫抓住,则得分为零,否则为所有老鼠进洞之前的步数和。求期望分数。

\(n\leq 5\times 10^5\)

注意到方案合法当且仅当一个点最多存在一个儿子没洞。设 \(f(u)\) 表示 \(u\) 往上走且其他部分合法的期望步数。考虑用一步单步容斥,转化成 \(\sum_{v\in sub(u)}\operatorname{Pr}(v,u)\),其中 \(\operatorname{Pr}(v,u)\) 表示 \(v\) 走到 \(u\) 还不进洞且外部合法的概率。

\(\operatorname{Pr}(v,u)\) 的式子写出来,可以递推。复杂度 \(O(n\log mod)\)

模拟赛 T2

给定一棵 \(n\) 个点的树,边带边权,点带点权。现有一个人有生命值 \(t\)。每走一条边权为 \(w\) 的边就会减去 \(t\) 的生命值,到达一个点权为 \(v\) 的点会增加 \(v\) 的生命值,若生命值小于等于 \(0\) 则会死亡。\(q\) 次查询 \(u,p,t\),问有多少点 \(v\) 满足,\(u\)\(v\) 的路径不经过 \(p\),且若初始生命值为 \(t\),则从 \(u\) 能到达 \(v\)

\(n,q\leq 2\times 10^5,t\leq 10^{13}\)

显然能到达的地方是一个连通块,考虑用点分治实现。从一个分治重心作为起点可以方便地 DFS 出到达每个点所需要的最小初始生命值,若不考虑 \(p\) 的限制,则可以做到 \(O(q\log^2 n)\)。加上 \(p\) 的限制,那就是相当于减去 \(p\) 子树内贡献,是一个二维数点,也可以在 \(O(q\log^2 n)\) 内解决。

Day 5

模拟赛 T1

给定一棵 \(n\) 个节点的树,每个节点的点权 a_u 是一个关于时间的一次函数 \(f(t)=k_it+b_i\)。支持两种操作:

  1. 给定 \(t,u,v,w\),表示从 \(t\) 时刻开始,\(k_u\leftarrow k_u-w\)\(k_v\leftarrow k_v+w\),保证 \((u,v)\) 有边。
  2. 给定 \(t\),查询 \(t\) 时刻时的 \(\min_{u}\{\sum_v \operatorname{dis}(u,v)a_u\}\)

\(n,q\leq 5\times 10^5\)

做法一。考虑每条边的贡献,就是两边子树权值和的较小值。因为贡献是一次函数,所以最多有一个时刻大的子树被小的反超,维护这个时刻。又因为修改的特殊性,只会影响到一条边的贡献。\(O(n\log n)\)

做法二,大力维护。先找到树上重心 \(u\),然后求出 \(\sum_v \operatorname{dis}(u,v)a_v\)

先考虑怎么找重心。把原树的 dfn 序列排出来,则重心一定在序列带权中点到根的路径上。带权中点定义为权值前缀和第一个超过总权值和一半的点。重心是在树上子树大小第一个大于总权值和一半且最深的点,树上倍增求出即可。

然后考虑怎么求 \(\sum_v \operatorname{dis}(u,v)a_v\),把 \(\operatorname{dis}(u,v)\) 拆成 \(dep_u+dep_v-2dep_{\operatorname{LCA}(u,v)}\),重点在于后一项,拆贡献,转化成根链加根链求和。

以上所有可以使用 GBST 做到 \(O(n\log n)\)

Day 6

模拟赛 T1

给定一棵 \(n\) 个节点的叶向二叉树,定义一个拓扑序的分数为,设 \(p_i\) 表示点 \(i\) 在拓扑序中的排名:

\[\max_u\{\max_{t=1}^n\{|\sum_{v\in \text{leftsub}(u)}^n[p_v\leq t]-\sum_{v\in \text{rightsub}(u)}^n[p_v\leq t]|\}\} \]

求所有拓扑序的分数之和。

\(n\leq 2^{18}\)

首先把 \(\max=k\) 容斥成 \(\max\leq k\),这样要对每个 \(k\) 算出有多少种拓扑序使得分数 \(\leq k\)。考虑树形 DP,然后发现合并子树时跟子树内部的排列无关,只与两个子树的大小有关。设左边大小为 \(L\),右边大小为 \(R\),则相当于一个格路计数,算一次时间复杂度 \(O(\frac{L+R}{k})\)

发现对于 \(k<\max\{L,R\}-\min\{L,R\}\),答案为 \(0\)。对于 \(k>\max\{L,R\}\),答案等于 \(k=\max\{L,R\}\) 的答案。所以实际要算的只有 \(\min\{L,R\}\) 个值。

交上去发现过了,复杂度据说是 \(O(n\log^2 n)\)

模拟赛 T2

给定 \(n\) 个字符串 \(s_i\)\(m\) 个字符串 \(t_i\)\(m\) 个权值 \(w_i\)

定义 \(f(k,i,j)=1\) 当且仅当,存在一个对 \(t_k\) 分割成前后两半的方式,使得 \(t_k\) 的前半部分是 \(s_i\) 的后缀,后半部分是 \(s_j\) 的前缀。否则值为 \(0\)。求:

\[\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^mf(k,i,j)w_k \]

\(n,m\leq5\times 10^5,\sum_i |s_i|,\sum_i |t_i|\leq 10^6\)

\(t\) 的正反串分别建 AC 自动机。把所有 \(s_i\) 扔上去跑。枚举 \(t\) 的断点,考察 fail 树,发现贡献是两个子树大小乘积,也就是矩形面积,直接面积并。

posted @ 2025-11-30 11:08  Linge_Zzzz  阅读(0)  评论(0)    收藏  举报