9 月记录
P13644 K-LCA
给出树和 \(k\),每次询问给出区间 \([l,r]\),找到选择 \(k\) 个区间内的点使得 LCA
深度最大。
\(n,q\le 10^5,1<k\le n\)。
考虑回滚莫队,每次加入一个点,二分最深的子树个数 \(\ge k\) 的祖先,可以做到两个 \(\log\)。
考虑树链剖分,标号是先标号轻儿子,再标号重儿子。
则同一条重链上的点对应的 dfn
区间右端点相同。
这样就能线段树二分处理一条重链。
初始先得到答案在哪条重链上再二分即可做到单 \(\log\)。
P3206 [HNOI2010] 城市建设
修改边权,求最小生成树。
重温。
动态边权最小生成树。
已知原图的一个边集 \(S\)。
-
若将 \(S\) 边权设为 \(inf\),找出最小生成树,则非树边是没用的。
证明:将 \(S\) 边权降低,则根据
LCT
维护最小生成树的过程,只会替换树边。 -
若将 \(S\) 边权设为 \(-inf\),找出最小生成树,则不管 \(S\) 取什么值,树边都是要用上的。
证明:根据
kruskal
维护最小生成树的过程,当 \(S\) 的边全取最小值时,这些树边还能连接两个联通块,则若 \(S\) 边权增大,这些树边还能连接。
考虑 cdq
分治,每次跑到一个点 \([l,r]\),维护一个边集 \(f\)。
将 \([l,r]\) 要修改的边设为 \(-inf\),求出最小生成树,将树边直接缩起来,并从 \(f\) 中删去。
所以往下的联通块个数为 \(\mathcal O(len)\)。
将 \([l,r]\) 要修改的边设为 \(inf\),求出最小生成树,将非树边从 \(f\) 中删去。
所以往下的边数也是 \(\mathcal O(len)\) 的。
时间复杂度 \(\mathcal O(n\log ^2n)\)。
P13342 [EGOI 2025] Wind Turbines / 风力涡轮机
每次询问先将 \([l,r]\) 的缩到一个联通块,求最小生成树。
666。
考虑问题即在最小生成树上删去 \(r-l\) 条边,使得每个关键点独属于一个联通块。
暴力想法就是先将 \([l,r]\) 联通,再加入树边求最小生成树。
考虑隐式地求解,从小到大加入树边,若连接的两个联通块都存在 \([l,r]\) 内的点,则这条边不取,其他情况都取。
即重构树上某个点左右子树都有 \([l,r]\) 内的点,就有贡献,发现这些点即 \([l,r]\) 的两两 LCA
集合,只有 \(r-l\) 个。
则暴力就是建出虚树即可。
类似铃原露露,求出支配点对。
启发式合并时求出前驱后继,共有 \(\mathcal O(n\log n)\) 个点对。
但是我们要求贡献不能算重。
考虑扫描线,对于当前 \(r\),对每个点 \(u\) 维护 \(l\le c_u\) 则这个点有贡献。
可以事先对每个 \(u\) 的支配区间处理一下,使得左右端点单调。
那么修改就变成了区间加,单点查。
时间复杂度 \(\mathcal O(m\log m+n\log^2n+q\log n)\)。
P13345 [EGOI 2025] IMO
有 \(n\) 个人,\(m\) 道题,问最少公开多少道题的分数,使得排名与最终相同,且唯一确定。
\(n\le 2\times 10^4\),\(m,k\le 100\)。
先有知道上一个人分数的右端点,枚举当前人公开题数,找到一个最小的无交的分数的左端点的 dp
。
根据值域上无交,可以将若干东西分析成 \(mk\),就做完了。
xor
给定正整数 \(n,a,b\) 。
你需要选取 \(0\le x<a, 0\le y<b\) ,设 \(S_1=\{i:0\le i<n,i \bmod a=x\}\),\(S_2=\{i:0\le i<n,i \b mod b=y\}\) ,然后最大化 \(n−|S_1\oplus S_2|\) ,即 \(n−|S_1|−|S_2|+2|S_1 \cap S_2|\)。
要求单次询问 \(\log n\)。
\(n\le 10^{18}\),\(a,b\le 10^9\)。
答案可以表示为 \(n-(\lfloor\frac{n}{a}\rfloor+[n\bmod a>x])-(\lfloor\frac{n}{b}\rfloor+[n\bmod b>y])+2(\lfloor\frac{n}{lcm}\rfloor+[n\bmod lcm>z])\)。
先计算固定的系数,然后 \(n\leftarrow n\bmod lcm\) 答案不变。
通过 \(a,b\) 去计算 \(z\) 不太好,考虑枚举 \(z\),这样每次的 \(a,b\) 的变化都是 \(+1\)。
那么就是在一个 \(a\times b\) 的循环网格上,每次往右上角走。
问能否在 \(n\) 次操作内走到 \((a_0,b_0)\) 的右上角。
考虑先算出第一次合法时走到的是哪个点,最后算一下走到这个位置是否不超过 \(n\) 步。
假设 \(a<b\),不嫩发现可以转化为 \(a\times (b-a)\) 的情况,可以加速计算。
Cluster
\(m\) 个容量为 \(2\) 的栈,栈里共有 \(2n\) 个元素,其中 \(1,2,\cdots ,n\) 分别出现两次。
你每次可以选择两个栈 \(i,j\),把 \(i\) 的栈顶弹出,压入 \(j\) 里。你需要保证操作后栈的大小仍然不超过 \(2\) 。特别的,如果操作后 \(j\) 的大小是 \(2\),那么其里面两个元素必须相等。
你需要在 \(\lfloor\frac{3n}{2}\rfloor\) 次操作内使得每个栈内要么为空,要么是两个相等的元素。或者判断无解。
\(n\le m\le 2\times 10^5\)。
对栈顶和栈底连边。
则图形如若干环和若干链。
分别讨论几种情况即可。
鲍勃杂货店
给出一个后缀表达式,可以使用交换律,结合律(要求相同运算符),使得表达式的连续相等字符的段数最少。
\(s\le 5\times 10^6\)。
先考虑将表达式树上有连边的相同运算符缩起来,这样结合率就没用了,新树的同父亲的每个儿子可以任意排列。
我希望求出以每个颜色作为开头的子树最大答案。
发现若一种方案不是最大答案,则不优,故只需求出达到最大答案能以哪些颜色开头即可。
发现就是做一个二分图匹配,然后求每个点能否删去使得最大匹配不变。
争锋频道
给定点数为 \(2n\) 的无向图,求完美匹配方案数。
\(n\le 20\)。
考虑将任意两种完美匹配的边连起来的图形成若干个环。
每个环的边的虚实相错的。
考虑定义虚边的匹配为 \(2i,2i+1\)。
对每个环从最小点开始加边,每次加入一条实边,对应加入他的虚边,或者选择结束这个环,而直接记录当前有哪些虚边就能知道所有点集。
故可以处理出哪些虚边构成一个环的方案数,对其做 exp
即可。
写作
给出一棵树,以及一个排列,每次可以交换相邻数,求最少次数使得树上每个子树的点形成一个区间。
从下往上不好优化。
可以考虑从上往下聚拢,这样不影响内部的逆序对个数。
聚拢的时候需要求出两类之间的逆序对个数,考虑轻重链剖分,枚举轻儿子计算即可,信心使用线段树合并维护。
字符串
给出母串 \(A,B\),定义一个串是好的当且仅当存在划分成偶数段的方式,使得每一段为 \(A\) 或 \(B\) 的子串,排列的顺序为 \(A\) 的子串和 \(B\) 的子串交替排列。
求长度 \(\le K\) 的好串个数,字符集为 \(A,C,G,T\)。
\(|A|, |B|\le 20\),\(K\le 10^9\)。
考虑分成公有与私有字符处理。
对于一个匹配区间 \([l,r]\),若 \((l,r)\) 存在公有字符,则一定可以切开调整。
故对于一个极长的私有区间 \([l,r]\),匹配左端点一定是 \(l-1,l\),右端点一定是 \(r,r+1\)。
对于极长的公有区间,一定不存在连续 \(3\) 个字符属于同一个匹配区间,否则可以调整。
故中间的匹配区间长度为 \([1,2]\)。
若当前属于公有区间,则需要记录 \(i-1,i\) 分别能否以 \(A,B\) 结尾,以及当前的字符。
若从公有区间进入私有区间,根据公有区间的结尾能否匹配,可以贪心以 \(l-1\) 或 \(l\) 开始匹配,这时候只需记录当前在谁的私有字符上,以及跑到的 sam
节点。
总信息可以做到 \(\le 144\) 个。
然后矩阵快速幂即可。
带权重心
https://www.cnblogs.com/caijianhong/p/19074425
从树上的任意一点出发到树上所有点的距离乘上目标点的点权和最小的起点一定是树的带权重心,\(k\) 次方仍然成立。
以任意点为根时,子树的点权和大于等于整棵树点权和的一半的点中最深的那个点是带权重心。
点带正权时,子树的点权和大于等于整棵树点权和的一半的点是根所在重链的前缀。
令任意一个节点为根,带权重心是带权 DFS 序的重心在树上所代表的节点的祖先,找到之后倍增往上跳到第一个“子树权值和大于等于 \(\frac{s}{2}\)”的点即可。
CF2138D
给出一个初始箱子状态,以及一个操作序列 \((x,p)\),表示将第 \(x\) 个箱子推到 \(p\),路径上的箱子会挤过去。
对于操作序列的所有排列方式,求每个点在所有方式下的最终位置之和。
\(n,q\le 5\times 10^3\)。
直接考虑求结束位置 \(\ge x\) 的方案数即可。
P14008 序列游戏
定义一个序列的权值是所有极长颜色段长度的平方的和。
已知序列 \(a\) 长度为 \(n\),\(a_i\) 是在区间 \([l_i,r_i]\) 之间等概率选取的整数,对于所有可能的序列 \(a\) 求权值的期望。
\(n\le 2\times 10^6\)。
可以先求极长差分,问题变成求形如枚举 \(r\),求出 \(\sum_{l=1}^{r}\max(0, \min_{i\in[l,r]}R_i-\max_{i\in[l,r]}L_i+1)a_l\)。
如果没有对 \(0\) 取 \(\max\),直接维护 \(\min,\max\) 两个单调栈就能快速更新了。
否则考虑每次加入完单调栈后对开头不合法的位置弹出,复杂度均摊正确,更新也是可以快速做的。
P14009 数字游戏
sb 题。
P13997 【MX-X19-T6】「FeOI Round 4.5」はぐ
给出一棵树,每次询问给出 \((u,v)\),定义路径点序列为 \(p_i\),求 \(\oplus_{i=0}^{len-1}(a_{p_i}+i)\)。
\(n\le 2\times 10^5\)。
妈的怎么不是根号??
先将 \(a_{p_i}+i\) 拆开独立,可以看成 \(a_{p_i}-dep_{p_i}+k\) 或 \(a_{p_i}+dep_{p_i}-k\)。
考虑拆位,\(a+b\) 第 \(k\) 位为 \(1\) 的条件:若固定 \(b\),则要求 \(a\bmod 2^k\) 在至多两个区间中。
求路径上权值在一个区间中的点个数的奇偶性。
对值域扫描线。
单点加,路径查不好优化。
考虑转成子树加,单点查。
时间复杂度为 \(\mathcal O(n\log n\log V)\)。
AT_arc205_d
给出一棵树,求最大匹配,使得匹配的两个点不为祖先后代关系。
\(n\le 2\times 10^5\)。
考虑从上往下做,对于根节点的子树,若最大的 \(\le\) 其他的和,则可以全部匹配,否则可以证明存在一种最大匹配方式使得其他子树全部连到最大子树上了,递归求最大子树最多的匹配数即可。
括号序列(bracket)
给出长度为 \(n\) 的括号串,每个左括号有正整数权值 \(a_i\),定义一个子序列是合法的即他组成的括号串合法,定义合法子序列的权值为所有左括号的权值和。
\(q\) 次询问,求 \([l,r]\) 合法子序列的最大权值。
\(n,q\le 2\times 10^5,a_i\le 10^9\)。
这不是我们“推箱子”吗?
另外的性质:括号串的最大匹配数为右括号个数 \(+\) 前缀最小值。
从左往右就是维护剩余左括号的堆,加入右括号时查找最大值匹配。
从右往左就是定义右括号权值为 \(0\),并于当前已经匹配的左括号放入一个堆中,加入左括号时,如果最小值比他小就替换掉。
然后考虑猫树合并,左半区间剩下若干左括号,右半区间有若干匹配左括号和若干剩余右括号,合并就相当于总体求个前 \(k\) 大和。
时间复杂度 \(\mathcal O(n\log^2 n)\)。
你的名字
有 \(n\) 个字符串,每次操作可以同时将 \(26\) 个字符各自改成某种字符,或者问 \(S_x\) 在所有字符串里的排名。
\(n,q,L\le 5\times 10^5\)。
当修改发生合并了就重构。
否则只需考虑与串 \(i\) 的 \([1,j]\) 相同,且 \(j+1\) 位为字符 \(c\) 的个数就能计算贡献。
统计一下即可。
树的直径
给出一棵树,每条边权值取 \([0,1]\),求所有方案下的直径数量(端点不同)之和。
\(n\le 3000\)。
考虑找到直径中电,不妨假设中点在点上。
则我们只需要求中点子树最大深度存在相等的即可,这样就能唯一钦定直径长度了!!!
对于原题,直径长度为奇数时,一定在边的中点上,否则在一条链上都行。
对于偶数的,考虑点减边容斥。
我们惊奇地发现,奇数边中点方案与偶数边中点方案抵消了!
最后只需计算点为中点的情况了,直接树上 dp
,在根处合并子树。
可以按照深度从小到大合并,复杂度就是 \(\mathcal O(n)\) 的。
然后考虑换根,一个点的本质不同子树个数是 \(\mathcal O(du_u)\) 的,记忆化即可。
时间复杂度 \(\mathcal O(n^2)\)。
广为人知
网格(grid)
求多少长度为 \(m\) 的序列满足 \(0\le x_i\le b^i-c\) 且 \(\sum_{i=1}^{x_i}\le n\)。
\(1\le m\le 50, 2\le b\le 10^9,-b+2\le c\le b-1,0\le n<b^{m+1}\)。
考虑容斥:
后面的东西可以提出来,令 \(A=n+m+k(c-1)\),则有:
展开组合数:
后面的式子是 \(\mathcal O(m)\) 次的多项式,设为 \(\sum_{l}a_lx^l\),则枚举 \(l\),计算所有合法 \(s\) 的 \((\sum_{i\in s}b^i)^l\) 即可。
先不考虑合法,设 \(f_{i,j,k}\) 表示考虑前 \(i\),\(|s|=j\),的 \(k\) 次方,有转移:
再考虑合法条件,发现 \(\sum_{i\in s}b^i\) 不会进位,直接在数位 dp
上做这个 dp
即可。
逆序对(reverse)
给你一个排列,你可以选择一个区间将其升序排序,求最少操作次数使得排列恰好有 \(k\) 个逆序对,以及构造,保证有解。
\(n\le 10^6\)。
直接证明答案 \(\le 2\):
考虑枚举一个最长前缀 \(u\) 逆序对 \(x \le k\),再加一个数就会 \(x+p>k\),其中 \(p\) 为 \([1,u]\) 中 \(>a_{u+1}\) 的个数。
对前缀排序之后 \([1,u]\) 递增,我们发现这 \(p\) 个数都在 \([1,u]\) 的后缀,选定 \(k-x\) 个直接与 \(u+1\) 排序就能直接合法!!
若答案 \(=1\),直接双指针找即可。
追忆(recall)
给你以 \(1\) 为根的树,每次操作:
选择一个点 \(u\),(若存在父亲,则断开和父亲的边),然后删去子树中没有儿子的点。
求出最少操作次数使得删空,以及方案数。
\(n\le 10^5,dep\le 100\)。
浮夸(grandiloquence)
给出一棵树,以及 \(k\),操作为:
u c
,将 \(u\) 子树的 \(v\) 染成 \((dis(u,v)+c-1)%k+1\)。- 求 \(u\) 子树某种颜色的点个数。
- 插入一个叶子。
强制在线。
\(n,q\le 2\times 10^5,k\le 10\)。
你妈的。
最小极差(range)
给你长度 \(n\) 的非负整数序列 \(a\) 和 \(m\)。
对于每个前缀,虚拟地取出来,问:恰好进行 \(m\) 次选择 \(p\) 令 \(a_p\leftarrow \lfloor\frac{a_p}{2}\rfloor\) 的操作,序列极差最小值为多少。
\(n\le 2\times 10^5,0\le a_i,m<2^{31}\)。
暴力就是每次选择最大值操作。
考虑将 \(a_i\) 不断操作之后的序列摊到值域上,则答案就是删掉最大的 \(m\) 个数后,其他每个数存在的最大值之间的极差。
如果是前缀不断加数的话,这个分界上不断向右移动,每次移动时线段树修改即可。
序列变换(sequence)
定义两个不重序列等价当且仅当 \(\forall i<j,[p_i<p_j]=[q_i<q_j]\)。
一个长度 \(n\) 的序列 \(a\),初始 \(a_i=i\),进行 \(k\) 次操作:
- 令当前长度为 \(m\),等概率选择 \(i\in [1,m]\),令 \(a_i\leftarrow a_m\),删除 \(a_m\)。
再给你长度 \(n-k\) 的排列 \(b\)。
\(q\) 次修改,每次交换 \(b\) 的两个元素,每次修改后输出 \(k\) 次操作后 \(a,b\) 等价的概率。
\(k<n\le 5\times 10^5\),\(q\le 5\times 10^5\)。
城市旅游(tour)
进行两次行走,每次都是从 \((1,1)\) 往右往下走到 \((n,m)\)。
给出 \(k\) 个关键点。
求出有多少有序方案,使得每个关键点都被至少到过一次。
求出有多少有序方案,使得每个关键点都被至少到过一次,并且除了 \((1,1),(n,m)\) 之外,没有格子被经过大于一次。
\(n,m\le 10^6,k\le 5000\)。
序列查询(query)
给出长度 \(n\) 序列,每次操作:
- 区间翻转。
- 查询区间 \(\operatorname{mex}\)。
\(n,q\le 2\times 10^5\)。
神秘。
考虑 recall
,不过那题我写的是对 \(a,b\) 分块,但有一个做法是对操作分块。
考虑操作分块,每 \(64\) 个操作分成一块。
那么最后序列肯定有 \(\mathcal O(64)\) 个段,每个段形如上次序列一个区间的正序或倒序,可以模拟处理。
求出每一段被哪些询问包含。
继而求出每一种值被哪些询问包含。
再从小到大枚举值域,每次将不包含当前数的询问标记答案即可。
时间复杂度 \(\mathcal O(\frac{n^2}{64})\)。
P14010 遍历游戏
给定平面上 \(n\) 个关键点,保证关键点四连通,删掉关键点后的图八连通。
定义关键点间的最短路为最小曼哈顿路径满足路径上全是关键点。
给定 \(k\),求多少对关键点最短路为 \(k\)。
\(n,k,x_i,y_i\le 10^5\)。
考虑存在 \(2\times 2\) 全是关键点,则连出来的图无环,且联通,为树,就变成了点分治模板。
考虑正常情况,发现,将一行的缩起来,相邻行联通的连边,还是一棵树,因为保证了一行的点不会有边。
在这个基础上再跑点分治还是对的,时间复杂度 \(\mathcal O(n\log ^2 n)\),可能可以优化。
P14030 【MX-X20-T4】「FAOI-R7」连接时光 I
有一个长度为 \(n\) 的整数序列 \(a_1, \ldots, a_n\)。
一个 \(1 \sim n\) 的排列 \(p_1, \ldots, p_n\),价值 \(f(p)\):
- 设置一张无向图 \(G\),点的编号为 \(1\sim n\),初始没有边。
- 对于所有 \(1\le i<j\le n\) 且 \(p_i>p_j\) 的对 \((i,j)\),在 \(G\) 中添加一条连接 \((i,j)\) 且权值为 \(a_j\) 的边。
- 如果 \(G\) 不连通,则 \(f(p)=-\infty\),否则 \(f(p)\) 为 \(G\) 中所有边的权值和。
求出所有 \(1 \sim n\) 的排列 \(p\) 中 \(f(p)\) 的最大值,并给出一个使 \(f(p)\) 取到最大值的 \(p\)。
\(n\le 10^5\),\(\lvert a_i\rvert\le10^9\)。
妙妙,先操作最优的东西,再对剩下简单的结构考虑。
先考虑全 \(<0\) 怎么做,显然尽量让边少,一个点前面联通的代价是 \(a_i\),与后面联通代价是后面的 \(a_j\)。
若一个点不是后缀最大值,我们最优可以让他只连一条边,连向后缀最大值,让非后缀最大值单增。
再考虑这个序列是单调递减的,所有数都是后缀最大值,这种情况下 6 1 2 3 4 5
可以做到最优。
显然前半部分将 \(\ge 0\) 的降序,\(<0\) 的升序可以做到最优。
最后再将前后两个部分调整一下联通即可。
P14031 【MX-X20-T5】「FAOI-R7」连接时光 II
长度为 \(n\) 的非负整数序列 \(a_1, \ldots, a_n\) 和一个 \(\{1, \ldots, n\}\) 的子集 \(S\)。
对于一个 \(1 \sim n\) 的排列 \(p\) 和一个 \(\{1, \ldots, n\}\) 的子集 \(S\),排列 \(p\) 的价值 \(f_S(p)\):
- 设置一张无向图 \(G\),点的编号为 \(1\sim n\),初始没有边。
- 对于所有 \(1\le i<j\le n\) 且 \(p_i>p_j\) 的对 \((i,j)\),在 \(G\) 中添加一条连接 \((i,j)\) 且权值为 \(a_j\) 的边。
- 如果 \(\forall x\in S\),\(\{1,2,\ldots,x\}\) 的点组成的导出子图是连通的,则 \(f_S(p)\) 为 \(G\) 中所有边的权值乘积;否则 \(f_S(p)=0\)。
设长度为 \(n\) 的排列组成的集合为 \(P\),你需要求出 \(\sum_{T\subseteq S}\sum_{p\in P}f_T(p)\) 对 \(998244353\) 取模后的值。
\(1\le n\),\(0\le a_i<998244353\)。
先考虑空,显然有个从前往后考虑插入数的排名的做法。
然后前后不联通相当于中间存在分隔线,如果后面插入的数排名小于这个分割线,则重新联通,否则一直不联通。
据此 dp
即可。
P14032 【MX-X20-T6】「FAOI-R7」超级电话
有一个长度为 \(m\) 的整数序列 \(a_0,a_1,\ldots,a_{m-1}\) 与一个非负整数 \(n\)。初始时,\(i\in[2^n,m)\) 的位置满足 \(a_i=0\)。
询问开始前,你可以进行不超过 \(A\) 次操作:选择三个整数 \(x,y,z\),满足 \(x,y\in[0,m),z\in[2^n,m)\),令 \(a_z\gets a_x+a_y\)。
有 \(q\) 次询问,对于每次询问给出两个数 \(x,y\in[0,2^n)\):
- 设置长度为 \(2^n\) 的序列 \(b\),满足 \(b_i=a_{i\oplus x}\)。对于 \(i\in[0,2^n)\),将 \(a_i\) 改为 \(b_i\)。修改是永久的。
对于每次询问 \((x,y)\),你需要在下一个询问之前给出一个长度不超过 \(B\) 的序列 \(p\),满足:
- \(p_i\in [0,m)\)。
- \(\sum_{i=1}^{\lvert p\rvert}a_{p_i}=\sum_{i=0}^{y}a_i\)。
\(n=20,q=2\times 10^4,A=2522795,B=5\)。
\(n=20,q=2\times 10^4,A=1741995,B=6\)。
\(n=20,q=2\times 10^4,A=1373355,B=7\)。
对于 \(B=20\) 直接在后面建个 trie
就行了。
容易想到优化方向是类似底层分块的思路,每个点不一定非要 \(2\) 个儿子,不然深度在高了,使用 \(2^k\) 个儿子是可行的。
但是这样次数限制又不允许我们多枚举前缀儿子统计。
本地打表发现前缀儿子集合非常少!!!
那么直接对每种数据找到最优划分即可!!
2 4 8 32 512
2 2 4 8 32 256
2 2 2 4 8 16 256
就做完了。
CF2147D
给出正整数序列 \(a\),每个人可以选择一个至少在 \(a\) 中出现过一次的正整数:
- 将个数加入自己的分数。
- 令所有 \(x\leftarrow x-1\)。
求最优策略下先手的得分。
\(n\le 2\times 10^5,a_i\le 10^9\)。
不知道咋想的。
类似阶梯博弈,感觉就能想到奇偶性?
设奇数的个数为 \(f_0\ge f_1\ge \cdots \ge f_k\),设 \(S=\sum_{i=0}^{k}(-1)^if_i\),则以下策略可以获得至少 \(S\),若 \(k\ge 0\),选择 \(f_0\),否则选择任意偶数:
-
若后手选择偶数 \(x\),则你直接选择 \(x-1\),中间还可以收集到若干 \(f_i\)。
-
若后手选择奇数的 \(f_i\),那么最后差正好是 \(S\)。
-
若后手选择偶数的 \(f_i\),那么你可以做到更优。
而后手可以遵循这个策略令最后差 \(\le S\)。
CF2147E
给定非负整数序列。
\(q\) 次独立询问,你可以执行 \(\le b_i\) 次操作:选择序列一个元素加一。
最大化序列或和中 \(1\) 的位数。
\(n,q\le 10^5\),\(0\le a_i\le 10^9\)。
猜测补全的是后缀的 \(1\)。
枚举,考虑判定。
显然流程是选择后面一个数加过来,然后后缀都是 \(0\),留给后面的位去加。
从后面的最大值加过来是不劣的。
怎么感觉这就是 WC2025 ?
CF2147F
给定排列 \(p, s\),若 \(p_i>p_j\) 或 \(s_i>s_j\) 则 \(i\) 可达 \(j\)。
每次修改交换 \(p\) 或 \(s\) 的两个数,每次操作后输出可行可达点对数 \(i\to j\)。
\(n,q\le 10^5\)。
考虑先将 \(p\) 排成排列。
发现这个图包含一张竞赛图。
故缩点后形如一条链,且每个 scc
是一个区间。
怎么找到这些 scc
?
假设初始每个 scc
大小为 \(1\)。
考虑相邻两个 scc
,若 \(\max(a)>\min(b)\),合并。
那么最后的形态就是满足 \(s[1,i]\) 的集合恰好包含 \([1,i]\) 的 \(i\) 为段的结尾。
考虑怎么刻画这些结尾。
正难则反。
若 \(s_i<p_i\),说明 \([s_i,p_i-1]\) 不是段结尾。
若 \(s_i>p_i\),说明 \([p_i,s_i-1]\) 不是段结尾。
用值来描述可行性,则答案相当于每个数的贡献为他右边第一个全局最小值的下标,线段树可以维护。
P14062 【MX-X21-T7】[IAMOI R5] 若我不曾见过太阳
定义 \(k\) 级排序为将下标 \(\bmod k\) 相同的每类数内部排序。
给出一个排列,对其一次进行 \(n-1,n-2,\cdots,1\) 级排序,求排列有序最早在哪级排序后。
\(n\le 4\times 10^6\)。
先考虑对每个 \(i\) 求出使 \([1,i]\) 的数全部在 \([1,i]\) 的最小次数,对所有 \(i\) 取最小值就是答案。
观察排序的性质:对于一次操作中 \(\bmod k\) 相同且完成交换两个数,只能相邻,否则一定在之前的操作交换了,所以 \(k\) 级操作可以简单表示为将下标差 \(=k\) 的两个数排序,且每个同余类最多交换一对。
故找到在 \([1,i]\) 的最右的 \(1\) 和 \([i+1,n]\) 的最左的 \(0\),他俩一定是下标差最小的一对数,故他们的下标差就是最小次数。
对每个 \(i\) 都如此找即可,使用树状数组维护可以通过。
P14061 【MX-X21-T6】[IAMOI R5] 希望有羽毛和翅膀
给出一个字符串。
\(q\) 次询问 \((l,r,k)\),求出从 \(s[l,r]\) 中选出不重叠的若干长度 \(\ge k\) 的回文子串数量最大值。
\(n,q\le 2\times 10^5\)。
先 manacher
预处理一下。
考虑根号分治。
对于 \(k\le \sqrt n\),可以先扫一遍求出每个位置后面能否接 \(k\) 或 \(k+1\)。
这个贪心策略是正确的:从左往右贪心,能接 \(k\) 就接,不能接就接 \(k+1\)。
然后预处理每个点的 \(\sqrt n\) 级祖先即可回答询问。
对于 \(k>\sqrt n\),需要支持往右找到第一个合法中点。
考虑分块,修改是添加或者删除一个合法中点。
对每个点记录他块内右边第一个合法点,则每次询问最多跳 \(\mathcal O(\sqrt n)\) 个块,而块内是 \(\mathcal O(1)\) 的,总次数也是 \(\mathcal O(\sqrt n)\) 的。
故时间复杂度为 \(\mathcal O(\sqrt n)\)。
The 2025 ICPC World Finals Baku
E
有 \(n\) 个点,\(m\) 个人,每个人有一条独立的 \((u_i,v_i)\) 通道。
多天。
每个人 7:00 从 \(u_i\) 出发,恰好 12:00 到达 \(v_i\),14:00 从 \(v_i\) 出发,恰好 17:00 到达 \(u_i\)。
当两个人处于同一点上时,可以传递包裹。
每次加入一个人,求点对 \((u,v)\) 数量,使得一个包裹可以 \(u\to v\),也可以 \(v\to u\)。
\(n\le 2\times 10^5\)。
题意太诡异了。
他的意思是对于通道 \((u,v),(v,z)\),一个包裹是不能在 \(v\) 传递的,因为时间错开了。
考虑将一个点的 \(17:00 \sim 7:00\),与 \(12:00\sim 14:00\) 的状态分离,即连边 \((u,1)- (v,2)\),则条件变为两点任意状态之间联通。
考虑 kruskal
重构树,并在中间减去重复贡献。
每个联通块,一个点的两个状态只存一个,合并两个联通块时,枚举小联通块的点 \(u\),加上大块点对数,减去大块子树内的另一个状态在小块子树内的点数(即之前已经联通了),再减去大块子树内另一个状态在 \(u\) 另一个状态的块的子树的点数即可(即两个状态的另一个状态在之前联通了)。
时间复杂度 \(\mathcal O(n\log^2 n)\)。
H
J
K
The 3rd Universal Cup. Stage 25: Hangzhou
B
给定一个长度为 \(n\) 的序列,支持区间按位与一个数,单点修改。询问时求在区间 \([l, r]\) 中去掉恰好一个数后按位与的最大值。
\(1 \le n, q \le 10^6\)。
考虑若一个位存在两个 \(0\),则这位一定是 \(0\),找到最高的只存在一个 \(0\) 的位,选择这个数即可。
线段树上记录 \(0/1/2\) 表示每位存在几个 \(0\)。
但是这个三进制数太大了,可以考虑拆开维护,sol
里是维护按位与以及只存在一个 \(0\) 的位,可以更新。
找到位后再找数,线段树二分即可。
J
有 \(n_1\) 张红卡和 \(n_2\) 张蓝卡(无编号),在每张卡片上写 \(1\) 到 \(m\) 中的一个数字,同时满足 \(k\) 个限制。第 \(i\) 个限制是一对整数 \((a_i, b_i)\),表示能找到一对值分别为 \(a_i\) 和 \(b_i\) 的异色卡片,求方案数。
\(1 \le n_1, n_2 \le 10^9,1 \le m \le 20,1 \le k \le m^2\)。
考虑不合法条件即为:
- \(a,b\) 中存在两位全 \(0\) 就不行。
- 否则只有 \(10/10,01/01\) 不行,发现都相等了。
故先找到所有不存在两位全 \(0\) 的状态。
之后就是要求标记位相等且存在 \(0\) 就不行,随便容斥一下。
I
给定一个长度为 \(n\) 的环,环上添加了一条你不知道具体位置的弦。
每次你可以询问两个点 \(u, v\) 并获得它们的最短路长度。
需要用最多 \(40\) 次询问获取隐藏的弦的具体位置。
\(n \le 10^9\)。
先找到一对不符合的点对,则他一定经过了弦。
考虑将一个端点往左往右移动,那么一定是一边 \(+1\) 一边 \(-1\),除了点对与弦垂直的情况。
而 \(-1\) 的那边一定是弦的最近点的方向,在该方向上二分即可确定一个端点的位置。
之后弦的情况只有可能是相交或相离,由之前的信息可以快速求出唯二的两种情况。
Gathering Mushrooms
什么屎题。
P9257 [PA 2022] Mędrcy
有 \(n\) 个贤者,\(m\) 条咒语。每条咒语都被除了两人 \(a_i,b_i\) 以外的其余 \(n-2\) 个贤者知道。
每个贤者只知道自己会的咒语及其所有知道这条咒语的人名单;他们不知道总共有多少条咒语,也可能一个咒语都不会。
每天早上他们在一起聚会。
若某贤者从公开信息与所知情况推理出存在他不会的咒语,他会在当日午夜离开,以后不再出现。
某天流浪者公开宣布:“至少有一位贤者会至少一条咒语。”
判断在这 \(k\) 天里是否会出现有人缺席的聚会;
- 若会,输出最早的那一天 \(d\)以及当天缺席的贤者人;
- 若这 (k) 天中每天都全员到齐,则输出 \(-1\)。
\(3\le n\le 1000,m\le 3000,k\le 30\)。
考虑第一天走的人一定不知任何咒语。
第二天走的人一定认为只有与他不交的人不会走。
所以剩下来的人两两有交。
若存在三个人两两有交但全部无交,对于其中任意一个人来说,他与另外两个人有交,但交集不同,故他认为另外两个人第二天应该走了,但没走,故三个人这天都会走。
\(n\) 天的情况亦是如此。
故找到最小数使得存在这个多个人无共同交集即是答案。
但是 \(n-2\) 的性质没用上,考虑补集转化,即补集并为全集,也就是最小点覆盖。
但是最小点覆盖是 npc
,但有一定厉害的做法,考虑到当最大度数 \(\le 2\) 的图可以快速处理。
故取出最大度数的点,枚举选他或不选他的情况,则 \(T(k)=T(k-1)+T(k-3)\)。
AT_arc115_f [ARC115F] Migration
给出一棵带点权树,\(k\) 个棋子要从 \(s_i\) 移动到 \(t_i\),定义势能为所有棋子所在点的权值和。
使得移动过程所有局面势能最大值最小,输出最小值。
\(n,k\le 2\times 10^5\)。
考虑二分,求出两个场面能到的最小场面(势能相等比较字典序),即联通块代表元,若相同则可达。
显然存在操作顺序使得一定是一个点走到更小或相同且编号更小的点后再走其他点。
考虑求出一个点到排名比他小的且路径最大值最小的点,那么到其他点要么不优,要么由他跳几步到达。(!!!!
严谨证明可以考虑建立点的 kruskal
重构树。
故在这棵有根树上找最小出边跳即可。
可以去掉二分,过他们会到达相同点,类似 lca
的过程,让较大的跳即可。
具体实现可以建重构树后,按照排名不断标记点的祖先,每个点第一次跑到被标记的祖先就是碰到了第一个存在排名比他小的后代的祖先。
考虑优化,显然是按照 \(\max-h_u\) 跳,按照这个排序后,每次让同一个点的所有点一起跳,中间维护一个哈希值即可。
时间复杂度 \(\mathcal O(n\log n)\)。
矩阵
给出 \(n\times n\) 的矩形,以及 \(m\) 次矩形异或,求最后的图上的最大匹配(同行或同列的 \(10\) 可以匹配)。
还有 \(q\) 次单点修改,修改后求最大匹配。
\(n,m,q\le 2\times 10^5\)。
考虑 hall
定义即为选择若干行列,求交中 \(1\) 减并集中 \(0\) 的最大和。
这个可以表述为交中 \(1\) 加交中 \(0\) 减行列 \(0\) 和,故只需知道行列 \(0\) 和。
扫描线后,可以双指针求式子最大值。
考虑修改,发现对式子的影响全是区间加,简单维护即可。
QOJ8548 China Convex Polygon Contest
有一场 \(n\) 道题目的比赛,一共 \(m\) 秒。
已知对手会在比赛开始后的第 \(a_1, a_2,\cdots , a_n\) 秒通过一道题目,而自己做每道题目的用时为 \(b_1, b_2, \cdots , b_n\) 秒。
安排自己做题的策略(即,解决题目的顺序和提交题目的时间),最大化 Last Success 是自己的时间。
\(n\le 10^5,m\le 10^9\)。
很妙的反悔贪心。
考虑在时间轴上一段区间 \([l,r)\),找到第一次通过时间 \(x\),则贡献为 \(r-x\)。
显然按照 \(b_i\) 升序做题,求出前缀和,找到若干时间点。
每个段内每个点都可以匹配之后的整段,第一个点还可以匹配当前的部分段。
从后往前扫,仔细思考发现反悔方式就是前面来一个点匹配当前整段,然后原来匹配的点往后匹配整段,并且对于已经匹配的整段是无需反悔的。
那么我们只需在加入一个点并选择它的匹配后维护好所有前面来一个点之后的反悔方式(所有反悔方式一定是除了结尾为整段,其他全是整段),并用一个堆维护:
- 遇到一个空段,加入 \(r-l\)。
- 对于 \(t_2,\cdots,t_k\),全部选择堆顶。
- 若 \(t_1\) 往后选择的贡献更大,则选择堆顶,加入 \(r-l\)。
- 否则将 \(t_1-l\) 加入堆顶,表示扩展贡献最大的反悔方式。
时间复杂度 \(\mathcal O(n\log n)\)。
The 3rd Universal Cup. Stage 38: Guangzhou
F
数轴上 \(1\) 到 \(n\) 的若干位置有磁铁。每次可以选择一个磁铁操作,这个磁铁会消失,两边的磁铁会往外移动一格。你想进行恰好 \(k\) 次操作,并且使得最终磁铁仍然在 \([1, n]\) 之间。
给两个带 ?
的串 \(S\) 和 \(T\) ,求有多少种替换 ?
的方式可以使得 \(S\) 和 \(T\) 可能是合法的初始状态和最终状态。
\(n \le 5000\)。
显然匹配位置需要满足 \(A_p+2p=k+B_q+2q\)。
设 \(f_{i,j}\) 表示考虑 \(S\) 前 \(i\) 的选择,有 \(j\) 个 \(1\) 不匹配的方案数,就表示 \(j=p-q\)。
这样由 \(A_p\) 就可以推出 \(B_q\),就能转移了。
唯一需要注意的是 \(S_{A_p}=1\) 但钦定这位不匹配时,由于要求 \(T\) 中上个 \(1\) 到下个 \(1\) 之前不能有 \(1\),考虑根据势能的单增扫过去时不断检查。
条件就是 \(T_{B_q}\ne 1\and T_{B_q+1}\ne 1\and T_{B_q+2}\ne 1\)。
时间复杂度 \(\mathcal O(n^2)\)。
A
给定一个字符串,定义它的一个子串是好的,当且仅当可以将原串划分成若干个该子串的前缀。
对于输入的字符串求出它的好的子串的数量,相等但位置不同的子串算多个。
\(1 \le n \le 10^5\)。
发现当有 border
时可以切分,故若合法,存在切分使得每部分无 border
。
当一个切分不等于这个切分时,可以发现一定存在 border
。
故存在唯一无 border
切分。
??不会了
D
给你一个排列,问 \(i < j < k < l\) 并且满足 \(p_i \cdot p_k = p_j \cdot p_l\) 的对数。
\(1 \le n \le 5 \times 10^4\)。
可以转化为 \(\frac{p_i}{p_j}=\frac{p_l}{p_k}\),令 \(\frac{p_i}{p_j}=\frac{a}{b},\gcd(a,b)=1\)。
则四个数可以被表示为 \(ac,bc,bd,ad\),则问题转化为统计 \(a,b,c,d\),满足 \(\gcd(a,b)=1\),且 \(q_{ac}<q_{bc}<q_{bd}<q_{ad}\)。
对 \(\gcd(a,b)=1\) 反演,则对于 \(x\),要求 \(x|a,x|b\)。
必要条件是 \(\max(a,b)\times \max(c,d)\le n\)。
考虑对 \(\max(a,b)\) 阈值分治。
- 若 \(\max(a,b)\le B\),枚举 \(\max(a,b)\),枚举 \(\mathcal O(B)\) 个 \(a/b\),枚举 \(c/d\),求出所有 \((ac,bc),(bd,ad)\) 对,可以离线双指针。
- 若 \(\max(a,b)>B\),枚举 \(c,d\),则 \((ac,ad),(bc,bd)\) 对的条件是包含,需要二维偏序。
时间复杂度为 \(\mathcal O(n\sqrt{n\log n})\)。
QOJ 9904 最小生成树
给定一张 \(n\) 个点的完全图,点的编号为 \(1\sim n\),对于两个点 \(i,j(i\ne j)\),它们之间的边权为 \(a_{i+j}\),输出求解这张图的最小生成树的边权和。
\(n\le 2\times 10^5,1\le a_i\le 10^9\)。
从小到大枚举边权,条件是两个回文串匹配。
考虑倍增并查集合并,将 \([1,n]\) 顺序放到前 \(n\) 个点,再倒序放到后 \(n\) 个点。
在底层合并 \(i,2n-i+1\)。
这样回文串合并就可以表示为前 \(n\) 个点与后 \(n\) 个点对应区间的合并了!!
时间复杂度 \(\mathcal O(n\log n\alpha(n))\)。
P14135 【MX-X22-T6】「TPOI-4F」Miserable EXperience
给出一棵树,每个点带点权。
两种操作:
- 子树 \(-1\)。
- 选择某个深度,将这个深度的点 \(-1\)。
独立地对于每个 \(u\),求最少操作数使得 \(u\) 子树内点恰好为 \(0\)(子树外无限制),或报告无解。
\(n\le 10^6,0\le a_i\le 10^9\)。
The 3rd Universal Cup. Stage 30: Northern
E
初始有个 \(1\times 1\) 的格子,每次会将其复制拼成 \(2\times 2\) 的,并在两条中线扣掉三个点使所有网格联通,\(q\) 次询问两两最短路。
\(n\le 30,q\le 1000\)。
H
这不是那道 Flaaffy 吗?
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/19099071