9月记录

282.CF2001

D

贪心做不明白了。

按照字典序贪心。

比如说奇数位,让颜色最大。

有一种说法是选择一个最大的颜色填入,使得填入后剩余颜色都可填入。

形式些表述,我们已经构造了 \(b_1,b_2,\cdots,b_j\),其中 \(b_j=a_i\),设 \(l_x\) 是颜色 \(x\) 出现在 \(a[i+1,n]\) 的最后一个位置,那么我们可以选择 \(a[i + 1,\min_{1\le x\le n}(l_x)]\) 中的任何位置,找到里面的最小/最大颜色,更新即可,可以用线段树。

E1

\(g_{i,j},h_{i,j}\) 分别表示深度为 \(i\) 的大根堆,使用了 \(j\) 次操作,可以进行一次 pop 的数量,以及深度为 \(i\) 的大根堆,使用了 \(j\) 次操作,的数量。

转移简单,可以用前缀和优化。

E2

可以使用两次 pop 了,需要记录每个点最大儿子的这个信息。

\(f_{i,j,k}\) 表示深度为 \(i\) 的大根堆,使用 \(j\) 次操作,最大儿子为 \(k\),可以进行两次 pop 的方案数。

\(g_{i,j,k}\) 表示深度为 \(i\) 的大根堆,使用 \(j\) 次操作,最大儿子为 \(k\),可以进行一次 pop 的方案数。

\(h_{i,j}\) 同理。

转移考虑 \(f\),的两次 pop,可以两次都在同一个子树,也可以两次在不同子树,讨论一下即可。

前缀和优化,\(\mathcal O(nk^2)\)

283.[ABC367G] Sum of (XOR^K or 0)

考虑每种异或和的方案数。

\[ans_i=[y^0x^i]\prod_{i=1}^{n}(1+yx^{a_i}) \]

其中 \(x\) 作异或卷积,\(y\) 作循环卷积。

考虑 FWT,记 \(x\oplus y=\operatorname{popcnt}(x\and y)\bmod 2\)

\[[x^w]\operatorname{FWT}(A)=\sum_{i\oplus w=0}A_i-\sum_{i\oplus w=1}A_i \]

那么 \(A'\) 中的每个位置只能是 \(1+y\)\(1-y\),即 \((1+y)^a(1-y)^b\)

其中我们知道 \(a+b=n\),考虑求出 \(a-b\),得到 \(a,b\)

然后我们只需要知道 \(a,b\) 下式子 \(y^0\) 的系数,因为 IFWT 做的是线性变换,所以次方不会改变。

根据定义,有 \(A=\sum [A_i\oplus w=0],b=\sum[A_i\oplus w =1]\)

那么将 \(A_i\) 扔到一个桶中,做 FWT 就能得到每一位上 \(a-b\) 的值了。

时间复杂度 \(\mathcal O(nm+mV+V\log V)\)

284.各种多项式操作的 n^2 递推

285.[ABC366G] XOR Neighbors

考虑高斯消元。

如果存在自由元,那么就是无穷解。

要保证自由元 \(\ne 0\),就给每个自由元赋值 \(2^i\)

286.[ABC363G] Dynamic Scheduling

https://www.luogu.com.cn/article/o1mle23w

这里讲得挺好。

模拟费用流+线段树分治(去掉删除操作)

线段树维护流量,增量考虑增广路以及正环的影响。

287.CF2004G

容易发现,奇数段不超过 \(1\)

就可以 dp 了,记 \(f_{i,j}\) 表示前 \(i\) 个数最后一段以数字 \(j\) 为开头。

image

用矩阵乘法优化一下。

然后每 \(k\) 个分一块,维护块中前缀后缀积,就能一次矩阵乘法回答询问。

288.CF1978F

考虑一条斜线一定联通,两条斜线之间有连边只需要看最短距离。

就能变成一个一维问题了。

枚举 \(\gcd\) 的因子即可,找出 \(\mathcal O(n\ln n)\) 个数,相邻距离 \(\le k\) 的连边即可。

289.CF1979E

曼哈顿距离等边三角形的边长一定是偶数。(可能有用的性质)

旋转坐标系,变成切比雪夫距离,此时一定有:

image

set 里面判断就好了。

hot!!!
image

290.好串 (good)

考虑先处理前缀,所有前缀 \(\min\) 的位置前面都加个数,然后前缀 \(\min\) 都被摊平在 \(x\) 轴上,只需要记录后缀的前缀最小值个数,就能得到一个数被摊平后的权值,找到最大的与右端点的距离即可。

可以扫描线单调栈维护。

291.子串 (substring)

建出 sam,然后就是经典分治 ntt 合并重链了。

292.CF1366G

考虑每个点的策略:

  • 匹配,要求是字符;

  • 手动删除,无要求;

  • 与后面的 . 匹配,要求是字符,且中间操作后无剩下字符。

考虑朴素 dp,发现如果一个字符无法匹配,但他被后面的 . 删除了,这种情况无法计算。

建出括号树,如果在一个子树内剩下至少一个字符,那么必须是包含根的一个联通块,且最优情况是这个联通块的点的右括号都手动删除了,某些不选的字符显然保留右括号最优,否则的话,匹配他的右括号右移(又多个要求一部分全部删完的限制),不优。

我们可以不建出括号树来,上面的发现告诉我们什么,可以在朴素 dp 的基础上加上“跳子树”的操作,发现这样最优解一定被考虑到了。

时间复杂度 \(\mathcal O(n^2)\)

293.CF865C

类似题

https://pjudge.ac/contest/1114/problem/21743

https://www.luogu.com.cn/problem/AT_arc016_4

设已经结束第 \(i\) 关,这一次用时为 \(j\),后面的期望用时为 \(dp_{i,j}\)

image

简单来看设 \(dp_{0,0}=x\),则每个 \(dp\) 值都可以表示成关于 \(x\) 的一次函数,且导数在 \([0,1]\),那么 \(dp_{0,0}-x\) 的导数在 \([-1,0]\)

我们要求的是 \(dp_{0,0}-x=0\) 的解,已经知道 \(dp_{0,0}-x\) 单调递减,那么二分即可。

294.P6622 [省选联考 2020 A/B 卷] 信号传递

考虑状压当前选了哪些点,将贡献拆到点上,可以预处理出 \(g(s,i)\) 表示 \(s\) 集合在 \(i\) 前面,对 \(i\) 的贡献系数。

时间复杂度 \(\mathcal O(m2^m)\)

空间优化就折半就好了。

295.CF1188D

显然一个数不会加同一个数大于一次。

则构造序列 \(b_i\ge 0\),使得 \(\forall i\in[1,n],a_i+b_i=a_n+b_n\),且 \(\sum_{i=1}^{n}\operatorname{popcnt}(b_i)\) 最小。

知道 \(b_n\) 即可,转化为 \(\sum_{i=1}^{n}\operatorname{b_n+a_n-a_i}\) 最小。

考虑从低位往高位 dp

每次需要知道一位进位后有多少个 \(1\)

发现只需要知道:

  • 每个数这一位是什么值;
  • \(x\) 这一位是什么值;
  • 哪些数被上一位进位了;

由于每个数加的数相同(是 \(x\)),那么第 \(j\) 位被进位的数,显然是前 \(j-1\) 位的数 \(val+x\ge 2^j\),则 \(val\) 就是按照前 \(j-1\) 位从大到小排序后的前缀。

\(f_{i,j}\) 表示考虑到了第 \(i\) 位,被第 \(i-1\) 位进位了 \(j\) 个数,那么我们执行一次排序就能知道是哪些数被进位了,后面就好办了。

296.P10430

将操作倒过来,每次可以单点减 \(D\),要求最后单调不增(如果从加法角度看的话,会有很多限制)。

从后往前贪心,如果 \(a_i>a_{i+1}\),就修改 \(a_i\),那么最后一定有 \(a_i>a_{i+1}-D\)

可以发现 \(a_i\)\(a_{i+1}\) 在之后一定是要么都不变,要么都修改,类似连续段合并。

按照右端点扫描线,维护要连续段,加入单点,暴力合并连续段,修改查询用线段树维护即可。

时间复杂度 \(\mathcal O(n\log n)\)

297.CF1981

hot!!!

298.CF1957

299.CF1981F

\(f_{u,j}\) 表示 \(u\) 子树,包含 \(u\) 的链不含 \(j\) 的答案,则钦定这条链按照 \(\operatorname{mex}=j\) 计算答案。

发现最优解一定会被 \(\operatorname{mex}\) 符合的状态考虑到,且不符合的一定不优。

分类讨论合并即可。

一种优化是 \(\operatorname{mex}\) 的大小不会很大。

用线段树合并还能优化到 \(\mathcal O(n\log n)\)

区间加,区间取 \(\min\),区间最小值,完全不用吉司机。

300.CF771E

hot!!!

怎么300了。

考虑 dp\(f_{i,j}\) 表示第一行取到 \(i\) 列,第二行取到 \(j\) 列。

要么不取,转移到 \(i+1\)\(j+1\),要么取最小的右端点,往后转移。

考虑每种方案定义选择顺序,每次选取左端点最小的段,即对于 \(f_{i,j},i\ne j\),如果要转移,选择左端点最小的转移。

观察到当 \(i=j\) 时转移才有交叉,考虑记录 \(f_{i,i}\)

简要证明若 \(f_{i,j},i<j\)\(f_{i,j}>f_{i,i}+1\),要么不合法,要么可以有 \(f_{q,q}\) 转移得到。

则对于每个 \(f_{i,i}\),只需要保留 \(f_{i,j}=f_{i,i}+1\) 的状态,另一行同理,显然 \(j\) 越小越好。

总共 \(\mathcal O(n)\) 个状态,每个状态 \(\mathcal O(1)\) 的转移,所以是 \(\mathcal O(n)\) 的。

301.CF1821F

很神!

https://www.cnblogs.com/Zeardoe/p/17003282.html

302.QOJ8141

很神的题,dp 状态想不到,太暴力了。

\(f_{l,r,k,d}\) 表示区间 \([l,r]\),然后 \([l,l+k]\) 是最左边的段,这个段的和剩下长度为 \(d\) 的前缀,其他都是回文的,这样相当于实际钦定了回文中心在中间,后缀同理,可以转移。

随便跑跑就行了,鉴于这题几乎没人写,所以就不写了。

303.mx1

A

操作相当于 *2,+1

并且操作三不会影响最后两个数,所以倒着搞就行了。

B

直接容斥。

有一个正常的 \(nk^3\)dp

抽象问题,转换维度,可以优化成 \(n^2k^2\),不过还有 \(n^2\ln n\) 的做法,在下面。

哈哈,超级快速的多项式直接草过去了。

C

如果在笛卡尔树上考虑的话,每个节点肯定选择最长的最优,所以有用的只有 \(\mathcal O(n)\) 个区间。

每个区间肯定是从不合法到合法,单点修改就在笛卡尔树的祖先上考虑,倍增维护一个点的最浅的不合法祖先,每次修改的时候判断其是否变成合法了即可。

用树状数组实时维护合法区间的长度,回答询问即可。

D

就是cf的某道题

image

304.QOJ9254

加强版在这。

考虑我们容斥后需要求什么,有 \(n\) 个互不相同的球,有 \(m\) 个互不相同的箱子,每个箱子的球数 \(\le k\) 的方案数。

\(f_{i,j}\),则转移为

\[f_{i,j}\leftarrow j\times f_{i-1,j}-j\times \binom{i-1}{k}\times f_{i-k-1,j-1} \]

容易发现第二维减一,第一位就会减 \(k\),所以第二维是 \(\mathcal O(\frac{n}{k})\) 的,时间复杂度为 \(\mathcal O(\frac{n^2}{k})\)

总的复杂度就是 \(\mathcal O(n^2\ln n)\)

305.P9701 [GDCPC2023] Classic Problem

找出所有关键点,那么一个极长区间,满足区间内没有关键点,一定存在一个方案满足最小生成树上这个区间的点构成一条链。

所以可以缩成 \(\mathcal O(m)\) 个点。

模拟 B 算法,需要支持找出每个点连到其他联通块的点的最短边。

先考虑掉特殊边,容易。

再考虑普通边,在值域上考虑,两个点没有特殊边,那么最短的普通边就是左右端点距离的最小值。

维护 \(pre_i,nxt_i\) 表示 \(i\) 左边第一个与 \(i\) 不在同一联通块的点,后者同理。

但是中间可能会跳到一个点 \(nw\)\((nw,i)\) 有特殊边,所以就不存在普通边,以向左条为例,这时 \(nw--\)

如果 \(nw\) 减到一个与 \(i\) 同颜色的点,就跳 \(pre\) 边。

可以证明时间复杂度 \(\mathcal O(m)\),总时间复杂度 \(\mathcal O(m\log m)\)

306.QOJ7520

如果只有一天,就是个经典??的贪心问题。

对于 \(a_i\le b_i\) 的怪物,按照 \(a_i\) 从小到大打。

对于 \(a_i>b_i\) 的怪物,反过来考虑,即 \(-b_i,+a_i\),就是第一类问题了,这部分按照 \(b_i\) 从大到小打。

考虑排序得到最优打怪顺序,有 \(\mathcal O(n^2)\) 个时间段的打怪顺序是不同的,计算 \(x<y\) 变到 \(x>y\) 的时刻。

每个时间段的最优打怪顺序的相同的,最优答案是一次函数的半平面交,转成凸包,计算贡献即可,时间复杂度 \(\mathcal O(n^3\log n)\)

307.P10198 [USACO24FEB] Infinite Adventure P

首先有一个倍增,记 \(f_{i,k,j}\) 表示从点 \(i\) 开始,走 \(2^k\) 步,初始时间模意义下为 \(j\)

但是 \(t_v>t_u\) 的话,信息不够,无法合并。

修改定义,记 \(f_{i,k,j}\) 表示从点 \(i\) 开始,走 \(2^k\) 步,钦定如果走到一个点 \(t_v>t_u\) 就停止,初始时间模意义下为 \(j\),走到的点。

同时记 \(g_{i,k,j}\) 表示从点 \(i\) 开始,走 \(2^k\) 步,钦定如果走到一个点 \(t_v>t_u\) 就停止,初始时间模意义下为 \(j\),到停下来时走了多少步,走不到就是正无穷。

这样可以合并,两个 \(\log\) 回答询问,因为每跳一层,在一层走的复杂度是 \(\log\)

但是预处理是三个 \(\log\) 的,每种状态都会下降,就要 \(\log^2\)

考虑修改定义,记 \(f_{i,k,j}\) 表示从点 \(i\) 开始,钦定走了 \(2^k\)\(t_v=t_i\) 的位置,如果走到一个点 \(t_v>t_u\) 就停止,初始时间模意义下为 \(j\),走到的点。

\(g_{i,k,j}\) 表示从点 \(i\) 开始,钦定走了 \(2^k\)\(t_v=t_i\) 的位置,如果走到一个点 \(t_v>t_u\) 就停止,初始时间模意义下为 \(j\),到停下来时走了多少步,走不到就是正无穷。

这样按照 \(t_u\) 从小到大预处理,合并的时候就不会下降了,是一只 \(\log\) 的,修改是两只 \(\log\) 的。

每次跳的时候,如果不是路径 \(t\) 的最大值,直接跳到 \(t_v>t_u\) 的位置,否则倍增,这样跳一次 \(\log n+\log V\)

最多下降 \(\log n\) 次,所以查询时 \(\log n(\log n+\log V)\) 的。

308.平方问题

发现 \(998244353\)ntt 模数,\(2^k\equiv 1\bmod (p-1)\) 的循环节很小,是一个 \(\varphi\) 形的循环节。

线段树维护两类数,一类是还没进入循环的数的和,另一类是已经进入的了。

修改,如果一个区间有还没进入循环的数,暴力递归修改。

一个区间维护 \(sum_j\) 表示区间第二类数在环上跳 \(j\) 步的和,可以合并。

309.取石子

大型找规律题。

310.匹配

好神奇。

image

某两个部分有大小为 \(?\) 的匹配只需要考虑度数和,因为还顶了一个上界。

找到这样一个结构,就能证明最大匹配是 \(x\)

附证明:

image

dp 就行了,注意维护非 \(0\) 度点。

311.移球游戏(ball)

给每个球按照颜色排序重新附上一个排列的颜色。

如果我们能将球按照颜色排序,列排序,同一列从大到小排序,构造就从后往前将一列取出即可。(nm没想到,我是sb

有两种写法。

考虑冒泡排序,考虑相邻两列,存在要交换的颜色,先从标号为 \(m\)\(0\)\(m\)\(1\),然后将垃圾桶拉来,进行分类即可。

然后还需要将一列排序,同样将垃圾桶拉来,基数排序

另一种写法是我的sb写法。

考虑分治,左边选择一列,右边选择一列,一定有 \(0\) 个数 \(\ge m\) 或者 \(1\) 个数 \(\ge m\)

根据这个选择凑 \(0\) 还是凑 \(1\),操作两列时,将两列交换到中间位置,配合垃圾桶操作。

交换满的两列,同样考虑将垃圾桶拉来进行交换。

写的常数很大。

312.哈密顿(hamilton)

考虑将哈密顿路径拆成两个部分,\(1\to u\)\(1\to v\)

\(f_{s}\) 表示从 \(1\) 出发,经过了 \(s\) 的点,可以成为终点的点有哪些。

推一下可以计算。

枚举集合 \(s\),枚举终点,取补集的并即可。

313.CF1483F

枚举 \(s_j\),找到最长的后缀满足是给出的串,集合 \(S\)

显然 \(s_i\) 只能在 \(S\) 里选,还有一个条件是对于 \(s_i\) 每次出现的位置,不能有串包含它。

考虑串包含它的情况,要么它不是这个前缀的最大后缀,要么是,但是被一个 \(S\) 里的串包含。

反过来就是它是前缀的最大后缀,且不能有 \(S\) 里的串包含它。

惊奇地发现这样就可以考虑了,计算一个本质不同的串(\(S\) 里)的被 \(S\) 的串包含的次数,如果这个次数等于他的出现次数,就是有解的。

时间复杂度 \(\mathcal O(|S|\log|S|)\)

314.吃串串(string)

同样考虑 \(s_k\)\(s_i\) 只能在每个前缀的前两大后缀里取,记为集合 \(S\)

对于 \(S\) 里的一个字符串,显然它不能是一个后缀前 \(3\) 大以上的点。

\(S\) 中的串需且仅需(只能)有一个包含它。(这么牛,因为一个后缀如果第三大包含它,前两大一定被计算了,否掉这个串了)。

时间复杂度 \(\mathcal O(|S|\log|S|)\)

315.AT_awtf2024_a Moving Slimes

可能有点懂了。

显然选择一段前缀和一段后缀最优。

类似物理分析,考虑选择的前缀的重心和后缀的重心,这样前缀后缀内部的吸引就可以不用考虑了。

可以发现前缀后缀在没有合并时,相对速度始终为 \(k\),否则严格更小,时间记为 \(A_i\)

考虑答案下界,即考虑合并对速度无影响,那么答案至少了为 \(\max(A_i)\)

考虑答案上界,对于最后一个合并的相邻位置 \(p,p+1\),则 \(A_p\) 表示的就是最后时间,所以答案至多是 \(\max(A_i)\)

于是一种方案就是 \(\max(A_i)\)

考虑 \(k<n\),对于前缀选 \(i\) 个,后缀选 \(k-i\) 个,如果以 \([i,k-i]\) 为空隙不是这种方案 \(A_i\) 的最大值,那么一种用另一个 \(i1\),这种空隙比他大。

316.QOJ7742

一个很惊奇的发现。

找到一个点 \(u\),一直匹配 \(t\) 的前缀,第一次跳 fail 跳到的点 \(t\),匹配了 \(j'\) 次跳到的。

如果 \(dep_t\ge t\),那么根据 fail 的定义,后面的答案(\(j\ge j'\))等价于 \(t\)\(j'\) 级祖先的 \(j\ge j'\) 的答案。

否则,后面的答案等价于从根出发的一个后缀的答案。

如果是第一种情况,\(u\)\(t\)\(j'\) 级祖先只有一段前缀有差别,且差别是一段定值。

如果是第二种情况,就需要提前加上前 \(j'\) 次的贡献,需要前缀加等差数列。然后加上从根出发的贡献,再扣掉从根出发的前 \(j'\) 次的贡献。

维护一个 \(val_u\) 表示点 \(u\) 的所有 \(f\) 需要带上 \(val_u\) 的系数贡献到答案,发现这样就很好维护答案的二阶差分。

从而离线递推出答案。

时间复杂度 \(\mathcal O(n\log n)\)

image

317.AT_abc370_g

\(f(n)\) 表示长度为 \(m\) 的正整数序列,乘积为 \(n\) 的方案数,发现对每个质数插板即可,这个东西是积性的。

将好数的条件拆到质因子上,发现一个数不是好数这个东西是积性的,于是考虑容斥。

两个积性函数的点积也是积性的。

这两个函数的质数处以及次方处取值容易计算,且将质数拆开构造完全积性函数的前缀和,涉及到计算前缀 \(\bmod 3=r\) 的质数个数。

考虑到 min-25\(G(m)=\sum_{i=1}^{m}[i\in pr] f(i)\) 时,实际上无需用到 \(f\) 是积性函数这个性质,只要能快速求构造出来的完全积性函数前缀和即可,所以也是容易计算的。

318.想要有钱(money)

一种思路是考虑倒序将数位移到第一位。

这样 n...1 就可以卡了。

一种优化是,找到 \([1,\frac{n}{2}]\)\(>\frac{n}{2}\) 的数,和 \([\frac{n}{2}+1,n]\)\(\le \frac{n}{2}\) 的数,设有 \(c\) 个,操作 \(c\) 次,前一半就没有大于一半的数了,花费 \(\frac{1}{2}\),那么位移大于一半的数时,代价就会很小,位移小于一半的数时,前缀已经填满了,那么代价也会很小。

另一种优化是将当前数往右移动,设 \(j\to pos\),只需要 \([j+1,pos-1]\) 没有数选即可,找到所有选上没有影响的位置选上,暴力找到最优移动点。

319.想要大的(big)

太shi了,不过想清楚了还是很好写的。

首先 \(r\leftarrow r-n+1\),就不需要考虑边界了。

考虑拆到线段树的若干区间上,满足 \([l,l+2^k-1]\) 的区间,答案只有 $\log $ 个。

image

就做完了,比较难写。

320.想出去玩(travel)

怎么被这种题秒了啊,实在想不到。

考虑边分治,跨过这两棵子树的边共 \(3\) 条,从这 \(3\) 条边开始跑最短路。那么之后的答案就可以不考虑经过这 \(3\) 条边的,递归到子树做就可以了。

复杂度\(\mathcal O(n \log^2 n + q \log n)\)

注意边分治的二度操作。

321.mx2

这整场都太hot了!!!

hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!hot!!!

A

考虑到右边其实是冒泡排序的复杂度,左边是冒泡时每个数移动方向固定的复杂度,即左边是冒泡的下界。

考虑到 3 2 1\(2\) 方向不固定,于是可得答案最长下降子序列 \(\le 2\),可以发现这样一定满足。

怎么求呢,玩一下又知道,每次填的数要么扩展最大值,要么填上 \(\operatorname{mex}\),设 \(f_{i,j}\) 表示前 \(i\) 个数,最大值为 \(j\) 的方案数。

发现 \(f_{i,j}\to f_{i+1,k+1}\) 或者 \(f_{i,j}\to f_{i+1,j+1}\),这个东西无需考虑后者的选择,因为天然满足 \(i\le j\),当 \(i=j\) 是才不能填 \(\operatorname{mex}\),而我转移中已经钦定 \(i\le j\)

在网格图上考虑,每次可以向上若干步再向右一步,或者直接向右一步,不越过 \(y=x\)

奇妙的分析,发现前者只是(每次可以向上走一步,或者向右走一步)的所有路线扩展,所以其本质和 \(C(n+m,n)\) 是一样的,反射容斥即可。

B

你说的对,但是被薄纱。

被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱被薄纱

考虑求出 dag 的拓扑序。

对于一条边 \((u,v)\),当删除的点在 \([p_u+1,p_v-1]\) 时,经过 \((u,v)\) 的最长路径存在,即 \(f_u+g_v+1\)

对于一个点 \(u\),当删除的点在 \([p_u+1,n]\) 时,路径 \(f_u\) 存在,当删除的点在 \([1,p_u-1]\) 时,路径 \(g_u\) 存在。

但是,这显然是必要条件,但是怎么证明充分呢,即怎么证明用每个时刻用这些存在的路径的 \(\max\) 一定有最长路呢。

考虑拿出任意一条最长路,删除的点一定是这条路上的某个点。

考虑任意一条路径,将路径上的点的拓扑序取出,当删除的点在相邻两点之间时,这条路径就会有贡献,点的贡献是特殊的。

C

假设确定了点 \(p\) 的第 \(p_1,\cdots,p_{i-1}\) 维,当前星星加入后不合法,考虑用星星的第 \(p_i\) 维确定 \(p\) 的第 \(p_i\) 维。

枚举 \(k\) 的每个排列,一定能算到最优解,时间复杂度 \(\mathcal O(n^2k!)\)。mdmdmdmdmdmdmd 这都想不到。

怎么想到,找到一个贪心过程,探寻经过贪心过程得到的最优解的某些妙妙性质。

考虑对每个最优解如果某维是不必要的,设为 \(-1\),否则找到这一位最早的必要位置,标记。

如果一个位置没被标记,显然前面标记点对应的维度已经满足他的条件了。

考虑将维度按照最早的必要位置排序,得到一个维度的排列,按照这个顺序贪心。

显然存在一组最优解(调整),满足前缀的标记点不被之前已经填入的维度满足,即在这个位置填数是必要的。

发现这样就能用一种排列,描述一种可能的最优解了。

考虑 dp 优化这个贪心,从第 \(i\) 颗星星开始用排列 \(p\) 进行匹配,定义 \(f_{i,p,j}\) 表示点 \(P\) 的第 \(p_j\) 维第一次发生失配的位置失配位置同时表示第 \(p_{ j+1}\) 维第一次进行匹配的位置)。那么使用 \(p\) 匹配,以 \(i\) 为左端点最长的合法子段为 \([i, f_{i,p,k}-1]\)

考虑从后往前转移。

如果 \(f_{i+1,p}\)\(p_1\) 满足星星 \(i\)\(i+1\) 的第 \(p_1\) 维相同,那无需对 \(p\) 做任何调整。

否则我们要在 \(p\) 的基础上找到另一个排列 \(q\),让 \(f_{i+1,q}\) 转移到 \(f_{i,p}\)

注意到我们一定会将点 \(P\) 的第 \(p_1\) 维确定为第 \(i\) 个星星的第 \(p_1\) 维。不妨将 \(p\) 记作 \([p_1]AB\),那么 \(q\) 就是 \(A[p_1]B\)\(B\) 可以为空)。\(q\)\(p\) 的变化相当于提前使用第 \(p_1\) 维进行匹配,如果 \(q\) 中第一次使用第 \(p_1\) 维的星星和星星 \(i\) 的第 \(p_1\) 维相同就可以把 \(q\) 中的 \(p_1\) 提前成为 \(p\),并且只能从这些状态转移。

那么枚举所有的 \(q\)\(p_1\) 越靠前一定越优。时间复杂度 \(O(nk!)\)

这个实现方式太妙了。

考虑在 trie 上完成匹配。

void dfs(int now, int lst, int c, bool have) {
	// i已经匹配,i+1已经匹配,维度,p[1] 已经出现了
	if (have) {
		newdp[now] = lstdp[lst];
		for (int i = 1; i <= k; i++)
			if (son[now][i])
				dfs(son[now][i], son[lst][i], c, 1);
	} else {
		if (a[lstdp[lst] + 1][c] == need)
			dfs(now, son[lst][c], c, 1);
		else {
			newdp[now] = lstdp[lst];
			for (int i = 1; i <= k; i++)
				if (i != c && son[now][i])
					dfs(son[now][i], son[lst][i], c, 0);
		}
	}
}

D

可以想一个 dp,划分段,一段贡献最长不下降子序列,其他段贡献 \(0/1\),一位一位选择可以做到 \(\mathcal O(n^2)\)

考虑更优的转换:找出一个子序列,使其缩起来后段数 \(\le k+1\),那么他的长度可以贡献段数为 \(k\) 的答案。

可以发现答案具有凸性,再分析一下固定子序列的最左和最右颜色,也是凸的。

于是闵可夫斯基和和合并即可。

322.P6672 [清华集训2016] 你的生命已如风中残烛

如果 \(x_1,x_2,\cdots,x_m\) 是任何一个和为 \(1\) 的整数数列,则其所有循环位移中恰好有一个满足所有的前缀和都是正数。

扩展:和为 \(s\)\(s\) 种。

考虑证明卡特兰数,在前面加上 \(a_0=1\),这样就能运用这个定理了。

因为互不区分,所以此时方案数为 \(\frac{\binom{2n+1}{n}}{2n+1}=\frac{\binom{2n}{n}}{n+1}\),分母指的是一种相同的等价类有 \(2n+1\) 种方案,然后因为得出的方案开头一定是 \(1\),所以扣掉这个 \(1\) 就行了。

再考虑这道题。

先做转化,对于一张 \(w_i\) 的牌,效果是使牌增加 \(w_i-1\),对于普通牌,效果是牌数 \(-1\)

转化后要求的是牌排列方案数(区分),使得前缀和 \(\ge 0\)

考虑用上面的方法,使 \(a_0=1\),但是这样就不行了,因为得出的方案开头不一定是 \(1\)

考虑在末尾添加 \(a_{m+1}=-1\),再将所有数取反,此时序列和为 \(1\),原序列前缀和 \(\ge 0\),新序列前缀和 \(\le 0\),则新序列后缀和 \(>0\),从后往前看,运用上面的定理,发现次数最大的数一定是 \(1\),做完后得出的方案开头一定是 \(1\)

一共有 \((m+1-1)!\) 中圆排列,原本有 \(m-n\)\(1\),排列数是 \((m-n)!\),现在是 \((m-n+1)\)\(1\),排列数变成了 \((m-n+1)!\),除掉多的就好了。

323.CF1969

C

显然贪心不太好做。

考虑 dp,最终数组的形态一定是有若干段被覆盖的区间,每一段都被相同的数覆盖。

\(f_{i,j}\) 表示考虑到 \([1,i]\) 可以使用 \(j\) 次,转移考虑右端点为 \(i\)\(\mathcal O(k)\) 个区间,每个区间显然用最小值覆盖最优。

时间复杂度 \(\mathcal O(nk^2)\)

D

按照 \(b_i\) 从大到小排序,那么最优方案等价于前缀 \(a_i\) 的前 \(k\) 小加上后缀的 \(\max(0,b_i-a_i)\) 的和。

E

考虑贪心,从前往后加数,扫描线,维护所有左端点的唯一数个数,当不合法时,断开,容易证明。

修改考虑加入的这个数的前两个前驱即可。

F

考虑如果当前有两个相同的数,将其打出是最优的,证明考虑否则更换后面打出这两张牌的操作,一定可以调整。

考虑特殊局面,即 \(1\sim k\) 都出现了,此时没有贡献。

\(f_i\) 考虑考虑到 \([1,i]\) 特殊局面出现次数的最小值。

考虑枚举所有后继状态,计算下一个特殊局面的位置,时间复杂度 \(\mathcal O(n^4)\)

但是发现“下一个特殊局面的位置”只有 \(\mathcal O(n)\) 个,一定是出现且只出现了两个出现次数为偶数的颜色,这样后继状态选择这两个颜色就停止了,时间复杂度优化到 \(\mathcal O(n^2\log n)\)

注意到还需要计算到序列为空时的局面(即没有下一个特殊局面)的情况的后继状态的贡献,显然贡献为最后出现次数为奇数的数的个数(这道题真的很神奇,\(n,k\) 都是偶数,只需要考虑出现次数奇偶次数,无需考虑打出牌组等一堆细节!!!。

发现只有三类,就是使得出现次数为奇数的个数 \(-2\),不变或 \(+2\),计算一下这三类的个数,除去一定有下一个特殊局面的后继状态即可。

324.数(number)

注意到求 \(w\oplus(w+1)\) 的所有取值,发现是 \(2^k-1\)

插到线性基里判断一下每种值能否取即可。

325.车(rook)

显然第一问的答案为对角线最远距离,充要性易证,设为 \(d\)

第二问就非常厉害了。!!!

考虑找到条件 \(A,B\),使得既不满足 \(A\),也不满足 \(B\) 的方案一定是不合法的。

那么我们统计满足 \(A\) 的合法方案 \(+\) 满足 \(B\) 的合法方案 \(-\) 满足 \(AB\) 的合法方案(\(d!\))。

找到:

  • \(A\):前 \(k\) 行中,每一行都包含一个车。

  • \(B\):前 \(k\) 列中,每一列都包含一个车。

怎么计算满足单个条件的合法方案呢,以条件 \(A\) 为例,若前 \(k\) 行都有车,可以证明 \(d\times d\) 的矩形下方没有车。

进行容斥,使得矩形下方第一行全被覆盖,设这一列有 \(k\) 个数。

那么方案数为:

\[\sum_{i=0}^{k}(-1)^i\binom{k}{i}\prod_{j=1}^{d}(a_j-i) \]

解释一下,由于每一行都有车,并且钦定矩形下方第一行其中 \(i\) 列没被覆盖,乘法原理统计。

最后多项式多点求值优化一下即可。

326.CF2005

D

考虑分治,按照左端点扫描线,预处理右端点的两个权值,发现是两个 \(\log\) 段本质不同的函数累加,故得到的函数也只有 \(\log\) 段。

时间复杂度可能是两个 \(\log\) 的。

E

直接 SG 推导了,一个数取 \(1\) 当且仅当他右下角的矩形的下一个颜色对应的点 dp 值都是 \(0\)

维护二维前缀和可以通过 E1

考虑拿出每种颜色的下轮廓线,可以证明只有下轮廓线上的 \(1\) 是有用的,如果某个点是 \(1\),那么他右下角的这种点一定也是 \(1\),而越右下的 \(1\) 一定更优。

于是每种颜色拿出下轮廓线进行转移,单调队列优化,可以可以每种颜色的轮廓线点数 \(\le \min(n,m)\),故总复杂度 \(\mathcal O(k\min(n,m))\)

327.P9339 [JOISC 2023 Day3] Cookies

Gale-Ryser 定理:对于左右点数都为 \(n\) 的二分图,两个序列 \(a_i,b_i\) 可能是它的度数序列,当且仅当:首先它俩和相等,然后对 \(a_i\) 降序排序后,\(\forall k\in [1,n],\sum\limits_{i=1}^{k}a_i\le \sum\limits_{i=1}^{n}\min(b_i,k)\)

显然这题就变成了选择尽量少的桶,使得前 \(i\) 大的和 \(\le lim_i\),且和为 \(n\)

从大到小做一个完全背包,有 \(\mathcal O(n^3)\) 的东西。

考虑前 \(i\) 大,取了 \(j\) 个,则 \(b_i\times j\le N\),可以缩减到 \(\mathcal O(n^2\log n)\)

然后加上个 bitset 优化,\(\mathcal O(\frac{n^2\log n}{w})\)

328.CF1879E

怎么没想到啊??

考虑按照深度 \(3\) 循环染色,于是答案上界是 \(3\)

当树深度 \(\le 2\) 时,答案是 \(1\)

考虑什么时候答案可以为 \(2\),考虑若 \(01\) 染色,如果存在两个儿子数为 \(1\) 的点,那么不好确定走哪边,但是当所有儿子数为 \(1\) 的点深度奇偶性相同时,我们可以钦定不好选择时走某种颜色,对应着 \(01\) 染色即可。

有个坑点,根节点的儿子颜色任意选,对根的每个子树分开独立做即可。

329.CF1886E

怎么没想到啊??

考虑每个 \(a_i\) 从大到小排序,那么分配到同一个任务的一定是同一个 \(a_i\),否则可以调整出来。

那直接设 \(f_{s}\) 表示满足了 \(s\) 集合的任务,最小的 \(i\),转移考虑下一个任务取什么,转移到一个最近的点,可以预处理出来,发现单调,直接双指针即可。

时间复杂度 \(\mathcal O(2^mm+nm)\)

339.序列

连续 \(3\)\(-1\) 直接无穷解,还有一下边界情况。

如果只有一个 \(-1\),直接解不等式。

如果有两个 \(-1\),找到左右边的 \(\mathcal O(1)\) 个区间,两两计算方案数。

唯一特殊的是 \([0,r1],[lim+1,r2]\) 这两个区间两两的方案数。

由于 \(r1\le lim\),对于 \(x\in[0,r1]\)\(x\),其与右边的交是一段区间,且区间右端点 \(\le r2\)\(x\) 形成一段后缀,直接预处理,除这段后缀外的所有点与右边的交是 \([lim+1,r2]\),直接统计即可。

340.异或

很神奇但是很 trick 的题!!!!

容易发现一个点 \(j\) 对应的 \(i\)\(j\)\(x\)LCP,要求最后位为 \(1\),如果枚举 LCP,形如:

1000
0???

则后面可以任意取,且权值固定,这启发我们记录第一个没顶上界是第几位。

\(f_{i,j,0/1,0/1}\) 表示考虑前 \(i\) 个序列,当前正在考虑第 \(j\) 位,其异或和为 \(0/1\),之前是否出现了在这一位没顶上界的变量。

我们 dp 这样一个过程,如果一个变量在这一位顶上界,那么算上他后面所有情况的方案数。

按照位数从下往上考虑。

F(j, 0, 20) f[0][j][0][0] = 1;
F(i, 1, n) {
	pre[i] = pre[i - 1] ^ a[i];
	F(j, 0, 20) {
		if(j) sum[i][j] = sum[i][j - 1];
		ll msk = (1 << (j + 1)) - 1, t = 0;
		if((a[i] >> j) & 1) {
			int L = (a[i] | msk) ^ msk, R = L + (1 << j) - 1, vl = 1ll * (R + 1) * ((R + 1) ^ val[i]) % mod;
			b[i][j] = vl;
			t = 1ll * (R - L + 1) * vl % mod;
			sum[i][j] = (sum[i][j] + t) % mod; // 第i个人后j位任意取的所有方案的价值和
		}
		F(p, 0, 1) {
			F(q, 0, 1) {
				if((a[i] >> j) & 1) {
					if(q) {
						// 之前已经有这一位没取上界的了,直接算上这一位的贡献
						f[i][j][p][q] = (f[i][j][p][q] + 1ll * f[i - 1][j][p][q] * t % mod) % mod;
						// 之前全部顶上界,之前每一种方案中,让这一位对应构造异或和,权值固定
						f[i][j][p][q] = (f[i][j][p][q] + 1ll * f[i - 1][j][p][0] * b[i][j] % mod) % mod;
					}
					// 这一位取1,后面任意取
					f[i][j][p][q] = (f[i][j][p][q] + 1ll * f[i - 1][j][p ^ 1][q] * (!j ? 0 : sum[i][j - 1]) % mod) % mod;
				} else {
					// 当前位只能取0
					f[i][j][p][q] = (f[i][j][p][q] + 1ll * f[i - 1][j][p][q] * (!j ? 0 : sum[i][j - 1]) % mod) % mod;
				}
			}
		}
	}
}

查询时枚举最早存在没顶上界的位。

dF(j, 20, 0) {
	int w = (d >> j) & 1;
	// 前面的位与d相同,全部顶了上界,第j位与d相同,且当前存在没顶上界的变量的方案数
	ans = (ans + f[c][j][w][1]) % mod;
	if(((pre[c] >> j) & 1) != w) break;
}

341.

又是乱搞过题,还不会证明“正确性”,真的没救了。

记一下思路:

  • 考虑最优解构造,若干点取上界,所有没取上界的点选择向左或向右靠。

  • >>>*<<<>>>*<<<
    
  • 然后 dp 钦定上界点的选取,\(f_i\leftarrow f_j+g(j,i)\),其中 \(g(l,r)\) 表示 \(l,r\) 都取到上界的最优倒向贡献。

  • \(j\ge i-14\) 稳过、

考虑正解。

性质:在最优解中,如果 \(k_{i−1} \le k_i \ge k_{i+1}\),那么必然有 \(k_i = \min(p_i − p_{i−1}, p_{i+1} − p_{i}\),也就是说如果 \(k_i\) 是极大值,那么它必然顶到了 \(p_{i−1}\)\(p_{i+1}\),且不是极大值的点,\(k_i\) 一定单调。

证明:类似题解里调整证明即可。

不是极大值的位置一定与旁边的一个圆相切,一个极大值会往左或往右控制一段,这一段中 \(k\) 单调,且与最大值方向的圆相切。

考虑若某个位置是极大值,且往左控制,至多控制到哪些位,发现是 \(p_i-p_{i-1}\) 的极长上升段。

于是每个位置的圆只有 \(\mathcal O(1)\) 种取值,\(0\),上界,往左倒,往右倒。

于是简单 dp 即可。

感觉很迷。。。

好题分享2

342.CF1949D

考虑没有边的情况。

取出一个大小为 \(\frac{3n}{4}\) 的点集,一共两个点集,每个点集内部选 \(0\),点集之间用 \(1\) 连接。

这样 \(0\) 最长不超过 \(\frac{3n}{4}\),且 \(1\) 最长不超过 \(\frac{n}{2}\),因为不会重复经过一个点。

考虑有边权的情况,初始想法是继续找大小为 \(\frac{3n}{4}\) 的点集,使得给定的边组成的联通块内的点都在一个点集内(不论颜色)。

如果可以找到,注意到出现次数小的边少于 \(\frac{n}{4}\) 条,设颜色为 \(v\),我们构造点集内部的颜色为 \(1-v\),集合之间的颜色为 \(v\)

这样 \(1-v\) 是满足的,然后 \(v\) 最多 \(\frac{n}{4}=\frac{n}{2}=\frac{3n}{4}\)

我们按照给定的边连接联通块,从小往大选择联通块,可以证明一定能选择点集为 \(\frac{n}{4}-1\)\(\frac{n}{4}\)

考虑反证,如果不存在,则联通块大小 \(<3\) 的联通块总和 \(\le \frac{n}{4}-2\)

image

343.[ARC182D] Increment Decrement Again

感觉很 nb。

先拆 \(\bmod\),转化成 \(0<|a_i-a_{i-1}|<m\),很nb的一步转化。

然后 \(a\) 的大小关系不会改变,设 \(a'_1=b_1\),根据 \(b\) 的差值,构造使得 \(a'_i\equiv b_i\bmod m\),且满足上述条件,因为如果知道 \(a'_1\),那么可以谈心根据 \(a\) 的大小关系知道后面的所有最优取值。

然后问题变为确定 \(a'_1\) 的取值,显然是上面的 \(a'_1\) 加上若干倍的 \(m\) 得到,即最小化 \(\sum_{i=1}^{n}|a_i-a'_i-km|\),二分找到中位数即可。

344.QOJ9920

肯定是 dpdp 转移的。

如果设 \(f_i\) 表示前 \(i\) 个点的最优花费,这样要记录 \(75\) 个点的状态,根本不行。

考虑设 \(f_{i,j}\) 表示已经覆盖了 \([1,i]\),使用了 \(j\) 的代价,还剩下的最长的可以覆盖的时间。

发现若覆盖 \([1,i]\) 的最小代价是 \(x\),则只有 \(f_{i,x},f_{i,x+1},f_{i,x+2}\) 是有用的,因为 \(f_{i,x+3}\) 不如 \(f_{i,x}\) 加上到了下一个点再买一张 \(3\) 元的票更优,否则与 \(f_{i,x}\) 的最优性矛盾。

具体实现方式,记 \(g_{i,x,y,z}\) 表示前 \(i\)\(f_{i,x},f_{i,x+1},f_{x+2}\) 的值,转移考虑当前选不选。

若当前不选,需要扣除多余距离。

若当前选,则相当于新增一个可以买票的位置,计算出最优的前三个位置,转移下去,并且将当前的贡献直接乘上 \(2^{n-i}\) 累加进答案。

345.[ABC249G] Xor Cards

枚举 \(\oplus_{(x,y)\in T} x \le k\),的最长公共前缀,则后面的位任意选,将 \(a_i\) 后面的位删去,问题变为使得 \(\oplus a_i=k\),最大化 \(b_i\)

\((a_i,b_i)\) 拼接起来,从高位到低位倍增,在线性基中查询有无出现即可。

346.CF1842G

组合意义。

\(\prod a_i\) 转化为一个人在链上从 \(1\) 走到 \(n+1\)\(i\to i+1\)\(a_i\) 种方案。

修改的意义就是有一个工具,在某个点时,我可以选择一个工具,用 \(v\) 的方案走到下一个点。

\(f_{i,j}\) 表示考虑 \([1,i]\),激活了 \(j\) 个工具,:

  • \(f_{i+1,j}\leftarrow f_{i,j}\cdot a_{i+1}\)
  • 使用一个激活的工具,\(f_{i+1,j}\leftarrow f_{i,j}\cdot j\cdot v\)
  • 激活并使用一个工具,这个工具可以在前面就捡起来了,\(f_{i+1,j+1}\leftarrow f_{i,j}\cdot i\cdot (m-j)\cdot v\)

另一种思考方式。

\(b_j\) 为第 \(j\) 次操作选择的位置,答案即为 \(E(\prod\limits_{i=1}^{n}(a_i+\sum\limits_{j=1}^{m}[b_j\le i]v))\)

考虑拆期望,每一项是若干个 \(a_i\) 和若干个 \(E([b_j\le i])\cdot v\) 的积。

考虑将每一项同样的 \(j\) 一起计算 \(E(\prod_{k=1}^{t}[b_j\le i_k]\cdot v)\),其中 \(i_1<i_2<\cdots <i_t\),因为对于 \(b_j\)\(j\) 不同的项是独立的。

注意到只需要知道 \([b_j\le i_1]\) 的取值,如果是 \(0\),那么乘积就是 \(0\),否则,有一定的概率是 \(1\),那么此时后面的积都是 \(1\),就是这个概率。

\(f_{i,k}\) 表示当前乘积的所有项中出现了 \(k\) 个不同的 \(j\),所有乘积的和。

转移考虑当前第 \(i\) 项选择 \(a_i\) 还是 \([b_j\le i]\cdot v\),后者还要考虑 \(j\) 是不是第一次出现的,如果是,期望就是 \(\frac{i}{n}\),否则系数是 \(1\)

时间复杂度 \(\mathcal O(n^2)\)

347.CF878E

这个题感觉和7月份NOI2024集训某场比赛的A很像,好像是合并书本。

先分析一下性质。

首先最后的和肯定是原数组的数加权求和,每个数的系数是 \(2^{p_i}\),且 \(p_1=0,p_n>0\)

还有一个性质是 \(p_{i+1}\le p_i+1\)

考虑简要证明:

假设 \(i\) 先往右合并了若干数,那么 \(p_i\) 始终不变,\(i-1\) 往前合并若干数,然后 \(i-1,i\) 合并,\(p_i\le p_{i-1}+1\),则后面 \(i-1,i\) 始终在一块里了,所以 \(p_{i-1}-p_i\) 始终不变,得证。

显然正数必然取 \(p_i=p_{i-1}+1\)

考虑贪心,每次取出一个正数块,与前面的块合并。

发现这个与“合并书本“很像,在一条链上,只能与相邻合并,还有贪心顺序,不过这题贪心顺序不明显(不重要)。

可以得到,从前往后维护一个栈的结构,加入右端点,如果是正数,就往前合并,更新合并块的权值,如果还是正数,就一直往前合并,正确性等价于证明这个过程中在一个块内的数,在上面的贪心过程中也在一个块内(块的结构是相同的),我不会证,但是可以感性理解。。。

这题还有个启发是,询问是询问区间的最优块结构,这题将左端点所在的块直接在左端点断开,感觉是对的,但是也不会证!

实现起来有一些细节,注意到一个权值为负数的块,其真后缀的和必须是正数,否则可以断开更优。,所以第一个数权值为负,后面的权值和为正,即负数的权值比较小。

348.CF1142D

\(f_{i,j}\) 表示前 \(i\) 个字符,所有后缀,排名为 \(j\) 的好串个数。

转移只需要考虑 \(j\bmod 11<str_i\),求出 \(nxt_{j,c}\) 表示排名为 \(j\) 的好串加入字符 \(c\) 后的排名(一定合法)。

发现序列是递增的。

image

即所有排名比他小的数扩展后的所有数排名都小于他扩展的所有数。

那么新的串的排名为:

\[9+\sum_{k=1}^{j-1}k\bmod 11+c+1 \]

发现我们只需要记录 \(j\bmod 11\),就做完了。

349.CF1965D

若最大值出现 \(1\) 次。

找到给出的数的最大值和次大值,一定对应 \([1,n],[1,n-1]\),可以得到 \(a_1,a_n\)

然后将 \([2,n-1]\) 的和(可以得出,可能没出现,不影响)删去后,最大值一定是 \([1,n-2]=[3,n]\),一定至少出现一个 ,得出 \(a_2,a_{n-1}\),继续删除 \([1,n-2],[2,n-1],[3,n-2],[4,n-1],[5,n]\),剩下的最大值一定是 \([1,n-3]\),继续做下去即可。

否则,就是最大值被删掉。

考虑给出的数中出现次数为奇数的数,他们对应的区间一定跨过序列中点,且两边跨过的长度相等,可以得到 \(a_2,a_3,\cdots,a_{n-1}\),由于此时最大值为 \([1,n-1]\),所以可以得到 \(a_1,a_n\)

时间复杂度 \(\mathcal O(n^2\log n)\)

350.mx3

A

同一行一起处理,每一个点可以继承左边点 \(-1\) 的半径,然后暴力扩展,复杂度是对的。

B

唐了。

考虑拎出一个长度为 \(m\) 的上升子序列 \(p_i\),钦定到他时停止了。

对于每个 \(i\in[1,m)\)\(x\in(p_i,p_{i+1})\) 且满足 \(a_{p_i}\le a_x\le a_{p_{i+1}}\),则 \(a_x\) 不能作为上一个删的点。

考虑容斥,记 \(f_i\) 表示长度为 \(i\) 的上升子序列个数,则贡献为:

\[f_i\cdot (n-i)-f_{i+1}\cdot (i+1) \]

显然了,就做完了!!!!

C

考虑怎么解决这个问题。

考虑从小往大放数构造出一个单峰,每个数都可以选择往左或者往右放,发现小的数的选择方案不会影响大的数放时需要的代价(始终是前缀比他大的数的个数,后缀比他大的数的个数),即没有后效性。

考虑优化这个过程,左边比他大的数的个数是不变的,先线段树二分出后边比他大的数的个数超过左边的时间。

后面计算贡献就是做一个二维偏序差分。

D

gu

351.mx4

A

答案函数显然单调,二分,转移过程用单调队列优化即可。

B

唐了。

\(n\)\([1,m]\) 的随机整数,最小最大值取到 \([l,r]\) 的概率,是 \(([l,r])^n-([l+1,r])^n-([l,r-1])^n+([l+1,r-1])^n\),(傻了傻了傻了傻了傻了傻了傻了!!!!)!!!!

列出式子后交换枚举项,发现需要计算 \(\sum_{i=1}^{n}p^i\)\(\sum_{i=1}^{n}p^i i\),发现是可以简单计算的(啥比啥比啥比啥比啥比。

C

要找的东西相当于:

AB
CD
CB
AD
|
AB-BC-CD-DA

首先将相同的前后缀区分开,然后前缀与后缀连无向边,那么题目的条件就是找无向图的四元环(又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了又傻了!!!

可以做到 \(\mathcal O(m\sqrt m)\),首先枚举 \(a\),钦定他在四元环中按照度数,编号排序最大,走反向到 \(b\),令 \(b\) 走任意边到 \(c,a\ne c\),标记 \(c\),下一次走到一个被标记的 \(c\) 就说明找到了四元环。

D

hot!!!值得记录。!!!!!!!!!!!!!

考虑 \(a_{i,1}=a_{i,2}\)​ 怎么做,如果一个序列是偶数,那么每个人至少都可以取到一半。

发现最后一定是每个人各取一半,因为如果一个人多取了,说明在这个人的眼中,取的收益是很大的,那么在另一个人眼中,对手取这个的代价是很大的,可以理解为两个人的策略对冲了,于是就是各取一半。

还有另一种理解方式,我们令“每人拿一半”的局面为 \(S\),假设最后局面不为 \(S\),那么必有一人所获得分数小于 \(S\) 局面他的所得分数,而且,它拥有迫使局面达到 \(S\) 的方案(即不断与对手取同一序列的对称位置),所以他会令局面到达 \(S\),这对另一个人也同理,感觉这更好理解。

如果是奇数的话,也是各取一半,多出来的那个东西按照大小排序,先手取奇数位置,后手取偶数位置。

考虑二元组的情况,(不知道为什么,只知道很神奇,可以感性理解),两个人取的位置都是相同的,就是前一半后一半的二元组,如何选择?就 dp 一下即可。

根据 dp 出来的确定中间选哪边,或者两边都可以选,那么一个中间的二元组可以表示为 \((x,y)\) 表示 \(A\) 选有 \(x\) 的贡献,\(B\) 选有 \(y\) 的贡献。 错了。

对于一个序列 \(a\),取中间数对 \(A\) 的贡献为 \(f_{mid}-f_{mid-1}\),对 \(B\) 的贡献为 \(g_{mid}-g_{mid+1}\),相当于有若干 \((a,b)\),两边轮流选,A 选的收益为 \(a\),B 选的收益为 \(b\)

考虑 exchange ur???,对于两个二元组 \((a,b),(c,d)\)\(A\) 选前者,最后差为 \(a-d\),否则是 \(c-b\),于是按照 \(a+b\) 排序,\(A\) 取奇数位置,\(B\) 取偶数位置是最优的。

多次询问直接套上一个矩阵线段树,中间的部分可以离线,相当于维护 rank 下奇数位置的和以及偶数位置的和,也可以在线平衡树。

352.智慧树

\(f_{u,j}\) 表示 \(u\) 填了颜色 \(j\),使子树合法的最小次数。

\(f_{u,0}=\sum_{v} g_v\)

\(f_{u,j}=1+\sum_v \min(g_v,f_{v,j}-1)\)

线段树合并维护即可,md。

空节点的合并很有细节!!!!因为这题子树的颜色会有重合,需要仔细讨论。

时间复杂度 \(\mathcal O(n\log n)\)

353.极限火花

非法点只能在带子边界上。

对每条带子边,算出其他带子在这条边上的交,如果交不是全集,则有点。

354.美元巨大二的二

很好的势能题!!

如果某个区间操作连续相同的数超过 $\log $ 次,那么这个区间的数会全部相等,可以缩起来。

考虑暴力单点修改,如果前后相同就缩起来。

维护势能,当修改区间 \([l,r]\) 时,相当于 \([l,r]\) 的势能 \(-1\)\(l-1,r+1\) 的势能设为 \(\log\),可以看作加上 \(\log\)

于是总势能 \(\mathcal O(n\log n)\),每次花费 \(\mathcal O(\log V)\) 单点修改,势能减少一,于是时间复杂度 \(\log^ 2\),其中使用了光速幂。

考虑预处理光速幂的复杂度,\(\mathcal O(P^{\frac{3}{2}}+(\frac{P}{2})^{\frac{3}{2}}+\cdots) = \mathcal O(P^{\frac{3}{2}})\)。、

355.CF2013

D

显然如果 \(a_i>a_{i+1}\) 就操作。

最后的数组必定是不降的。

怎么加速呢》?》?》?》?!!!!!!!!

考虑缩起来,使用单调栈。

需要支持 \(a1\) 个值为 \(b1\)\(a2\) 个值为 \(b2\) 的数合并,\(b1>b2\)

发现,合并完最多两种数,且分别是平均数,平均数加一。

考虑证明,显然这种方案是可以达到的,且可以证明这种方案是第一次达到的,且序列不降后必然不可操作。

每次合并删除若干数,最多增加两个数,只会增加 \(n\) 次,所以复杂度是对的。

E

考虑先将所有数除掉全部 \(\gcd\)

做法:每次取出当前最小的数作为下一个数,然后将其他剩下的数与前缀 \(\gcd\)\(\gcd\),即贪心地取出令下一个 \(\gcd\) 最小的数,当最小的数为 \(1\) 时直接加速。

证明操作次数为 \(\log\),每次取 \(\gcd\) 的时候,除了 \(\gcd\) 相同的数,其他数都会至少少掉一个质因子,且每次必然存在一个不是 \(\gcd\) 的数。

第一次显然一定存在,因为已经除掉全局 \(\gcd\) 了。

考虑反证,如果不存在,那么剩下所有数都是 \(\gcd\),那么全局 \(\gcd>1\) 矛盾。

再考虑证明最优性:

\(A\) 为当前数组前缀的最小可能 \(\gcd\)\(B\) 为最佳答案,\(A<B\),那么调整,先弄上 \(A\),在填入 \(B\),答案更优,因为和 \(A+\gcd(A,B)=A+\gcd(A,B-A)\le B\) 不劣,使得 \(\gcd\) 更小,所以更优,然后后面的数还减少了一个,且减少的数的作用也发挥出来了。

很感性。

F

考虑简单版本,取出路径上的点 \((p_1,p_2,\cdots,p_m)\)

如果先手能走到某个点(后手无法挡住他,可以发现一定是路径的前一半),且先手从那个点下去子树,走到的最大距离大于后手在剩下联通块的最大距离,那么先手必胜。

考虑复杂版本,将问题分解为两个子问题 \(1\to u,1\to v\),这样更好做。

\(fa_i\) 表示后手起点在 \(p_i\) 时,先手能赢的最浅的点,\(fb_i\) 表示后手能赢的最深的点。

注意到,如果先手在点 \(p_i\) 下降能赢,则 \(i+mxd_i-1>\max_{j=i+1}^{m}(mxd_j+st-j)\)

那么先手在 \(p_i\) 能赢的合法 \(st\) 一定是一段前缀,左端点为 \(i+i\),可以二分确定有边界,设为 \([l_i,r_i]\)

那么 \(fa_j\) 就是最小的 \(i\),满足 \(l_i\le j\le r_i\),可以扫描线维护。

\(fb_i\) 同理。

那么 \(fa_i\le i - fb_i\) 就是必胜。

时间复杂度 \(\mathcal O(n\log n)\)

364.CF1096E

贝叶斯公式。

\(P(A|B)\) 表示在条件 \(B\) 成立的概率下,条件 \(A\) 成立的概率。

那么 \(P(A \and B)=P(A|B)P(B)\)

那么有:

\[P(A\and B)=P(B|A)P(A)\\ P(A|B)=\frac{P(B|A)P(A)}{P(B)} \]

考虑本题,设 \(A\)\(a_1\)winner 的概率,\(B\)\(a_1\ge r\) 的概率。

那么 \(P(A)\) 显然为 \(\frac{1}{n}\)

\(P(B)\) 容易计算,就是将 \(s-r\) 分配给 \(p\) 个人的概率。

\(P(B|A)\) 等价于序列最大值 \(\ge r\),为什么呢,概率是 \(\frac{a_1\ge r}{a_1 \ 为最大值}\),发现 \(1\) 换成其他数都相等,那么不就是 \(\frac{最大值\ \ge r}{所有序列方案数}\),分子分母同时乘上 \(\frac{1}{p}\) 的结构吗,不就是相等吗!》?!》?!》?!》(其实枚举 \(\max\) 可以做到 \(\mathcal O(n^2)\)

容斥成序列所有数 \(<r\),然后再钦定位置容斥就行了。

365.gym102978H

image

证明可以考虑极限等比数列。

类似题:P5644 [PKUWC2018] 猎人杀,[AGC038E] Gachapon

366.[AGC038E] Gachapon

https://www.luogu.com.cn/article/jwnwzprg
考虑 min-max 容易,变成计算一个子集第一次出现一个数 \(\ge B_i\) 的期望次数。

将期望拆成概率,则为 \(\sum_{j\ge 1}P(t\ge j)\),意义为第 \(j\) 轮子集所有数依旧 \(<B_i\) 的概率之和。

注意,这里某些轮可能会选到子集外的数,我们不管,考虑一个 hot trick,(!!!),每次有 \(P=\frac{\sum_{i\in T}a_i}{\sum_i a_i}\) 的概率选到集合内的数,那么期望选到一个集合内的数的次数就是\(\frac{1}{P}\),那么相当于将每跳一轮的贡献从 \(1\) 变为 \(\frac{1}{P}\)

计算第 \(k\) 轮的概率之和考虑一个状态 \(c_0,c_1,\cdots c_{n-1}\),满足 \(\sum c_i =k,c_i<b_i\),则方案数为多重组合数, 概率为:

\[\big(\frac{k!}{\prod_{i\in T (c_i)!}}\big)\big(\prod_{i\in T} (\frac{a_i}{\sum_{j\in T}a_j})^{c_i}\big) \]

image

考虑 dp,每种状态的贡献以及考虑容斥系数的影响。

\(f(i,j,k)\) 表示考虑到第 \(i\) 个,所选 \(a_i\) 的和为 \(j\)\(c_i\) 的和为 \(k\) 的贡献,注意到,无需记录选了多少个,在中间是否选数时考虑容斥系数即可。

转移:

\[f(i,j,k)=f(i-1,j,k)-\sum_{t=0}^{\min(b_i-1,k)}f(i-1,j-a_i,k-t)\cdot \frac{a_i^t}{t!} \]

注意 min-max 的容斥系数为 \((-1)^{|T|+1}\),故 \(f(-1,0,0)=-1\),其余为 \(0\)

image

367.PTZ2021sd3i Intellectual Implementation

https://www.cnblogs.com/0x0620AF/articles/PTZ2021sd3i.html

很妙的三角形乱模题。!!!!!

http://192.168.102.138/JudgeOnline/problem.php?cid=2017&pid=1

368.最优划积树法则(tree)

这场太弱智了。、。、。、

考虑 \(v_i \le 1\),显然是从下往上贪心,判断当前每个子树剩下的能否拼出大小为 \(k\) 的联通块,不行就往上拼。

以下为做法一。

引用过来,问题在于怎么判断是否能拼出大小为 \(k\) 的联通块,想法是每次算出最小删多少个 \(2\) 叶子后,可以删掉一个 \(1\) 叶子。

记当前总联通块和为 \(sum\),最小删 \(s2\) (权值和)个 \(2\) 叶子满足条件。

性质一:若 \(sum-s2\ge k\),那么一定可以。

证明:

考虑归纳,首先子树都无法恰好取出大小为 \(k\) 的联通块。

那么考虑先把 \(s2\) 删掉,然后设 \(s2\) 的父亲为 \(u\),保留根到 \(u\) 的路径,然后任意删,知道权值为 \(k\) (结束)或 \(k+1\).

如果最后就剩下根到 \(u\) 的路径,若权值为 \(k+1\),那么 \(u\)\(1\),直接删除合法,否则,权值 \(>k+1\),若根权值为 \(1\),由于这个子树原先无法恰好取出大小为 \(k\) 的联通块,不算根,当前剩下的权值和 \(>k\),那么这部分有权值和为 \(k-1\) 的联通块,算上根就合法了;否则根权值为 \(2\),由上,不算根,当前剩下的权值和 \(>k-1\),首先不能为 \(k\),那么权值和 \(>k\),转化为一条链,末尾为 \(1\),权值和 \(>k\),且不存在权值和 为 \(k\) 的子联通块,这显然是不合法的,因为先删掉末尾的 \(1\) 不行,那么权值和 \(>k+1\),然后从链头开始删,权值和一直删到 \(k+1\),再删末尾,就合法了,与假设不符。

否则,权值为 \(k+1\),删掉这个 \(1\) 不就行了。、kk

性质二:若 \(sum \ge k\)\(sum \bmod 2=k\bmod 2\),那么一定可以。

引用下面的东西,若到了 \(sum>k\) 且只剩一个 \(1\) 叶子的地步,又根据归纳,不合法了。

于是记录整个子树是否全是 \(2\),以及上面的一些东西,容易转移。

以下是做法二,看起来更清晰易懂。

考虑对于一个点权和 \(s(s\ge 3)\) 的连通块,先将其所有点权为 \(0\) 的叶子删去,则:

  • 若存在点权为 \(2\) 的叶子,将其删去可得到点权和为 \(s−2\) 的连通块;
  • 否则所有叶子点权为 \(1\),删去两个叶子可得到点权和为 \(s−2\) 的连通块。

所以设 \(f_{i,0/1}\) 表示 \(i\) 子树内包含 \(i\) 的连通块权值和为奇数或偶数的最大点权和。
从下至上贪心,若 \(f_{i,k \bmod 2}\ge k\) 则直接截取该连通块,之后就不考虑 \(i\) 子树了。
时间复杂度 \(\mathcal O(n)\)

好像很显然,如果满足条件,那么可以得到一个大小为 \(k\) 的联通块;

如果有一个大小为 \(k\) 的联通块,那么一定满足条件,怎么证明:

考虑证明如果不满足条件,那么没有大小为 \(k\) 的联通块,即 \(f_{k \bmod 2} <k\),那么需要 \(f_{(k \bmod 2) \oplus 1} \ge k\),于是这个东西一定是整联通块,那么我们要删掉权值 \(1\) 才能改变奇偶性,那么 \(f_{(k \bmod 2) \oplus 1}-f_{k \bmod 2}\) 就是上面做法一提到的“最小删多少个 \(2\) 叶子后,可以删掉一个 \(1\) 叶子”,那么显然了,奇偶性都无法得到,那就显然不行了。(其实有更简单的证明)

如果这个联通块下面有点权为 \(2\) 的叶子,就加上,否则所有叶子都是 \(1\),最多剩下一个叶子不加。

369.子集(subset)

\(k \ge 2^{15}\) 直接暴力。

\(x=\frac{t-b}{k}\),其中 \(t\)\(s\) 的子集,那么就是找到一个 \(t\ge b\),且 \(t \equiv b \pmod k\)

考虑折半,枚举 \(t\) 的高 \(15\) 位,那么可以知道底 \(15\)\(\bmod k\) 的值以及下界。

时间复杂度 \(\mathcal O(T2^{15})\)

370.呃呃(ee)

喵喵题。

存在四元环等价于两个点存在至少两个公共邻居。

加入一条边,会关于端点的 \(\mathcal O(n)\) 个公共邻居关系,那么是可以做到 \(\mathcal O(qn)\) 的。

但是,一开始,我们需要预处理公共邻居关系,这是 \(\mathcal O(\sum du_u^2)\) 的,直接卡飞了。

但是,注意到我们先将在过程中始终存在的边加入,如果判断是否存在四元环,如果存在,那么全都是有四元环的询问;否则,我们预处理出公共邻居关系的时间复杂度就是正常的。

因为如果加边的时候这两个端点已经存在一个公共邻居了,那直接结束,一共 \(\mathcal O(n^2)\) 个关系,所以只会最多跑 \(\mathcal O(n^2)\) 次就会结束了(这是第一部分)。

然后,只需要多预处理 \(\mathcal O(n)\) 条边的公共邻居关系,这也是可以接受的。

时间复杂度 \(\mathcal O(n^2)\)

371.CF2018

A

真的玉玉了。

考虑 \(k=0\) 怎么做,要求 \(sum\)\(lim\) 的倍数,且牌数最大值 \(\le \frac{sum}{lim}\)

显然我们不会改变最大值,但是可以让后面的值尽量大,使得平均值尽量大,判断一下即可。

还有一种解释是:

\[\forall i\in[1,\frac{sum}{lim}],\sum_{j=1}^{i}a_j\le i\times \frac{sum}{lim} \]

显然最紧的限制在 \(i=1\) 时取到。

B

先像那个 abcex 那样处理出真实的值,然后处理前缀后缀真实的值,判断每次取最小的限制能否满足,放在值域上,线段树维护即可。

C

显然,如果答案为 \(d\),那么深度 \(>d\) 的都要删掉,还有子树节点最大深度 \(<d\) 的也要删掉。

D

可以证明,最大值一定要取。

那么从大到小加数,在线段树上做个 dp 合并即可,记录左右端点是否取,当前是否取了最大值的情况下的最大数量。

最小值不用考虑,因为如果某次没取到最小值,那么一样在前面考虑到了,更优。

E

??

F

??

372.嘟嘟(交互题)

题解讲的很好。

image

373.滴滴

有一个简单的 \(n=2k+1\) 的构造,任意选择 \(p_1\),并取 \(p_i+k\equiv p_{i+1} \pmod n\)​。

然后好像可以搜出 \(n=2k+2\) 的构造,然后 dp 将其拼接,因为 \(n\) 比较大,所有有解。

374.叭叭呜

hot trick

问题相当于询问一个区间的所有子区间的虚树大小的和。

考虑一条边在一个区间的虚树上的条件,转化为 \(u\) 子树内有 \([l,r]\) 的点,且 \(u\) 不是 \(\operatorname{LCA}(l,l+1,\cdots,r)\) 的祖先,发现一个区间的虚树的大小可以转化为,有多少个点子树内有 \([l,r]\) 的点,减去区间 \(\operatorname{LCA}\) 的深度!!!!

考虑怎么求区间 \(\operatorname{LCA}\) 的深度,考虑扫描线,事实维护左端点对应区间的 LCA,加入 \(r+1\),即 \(u=\operatorname{LCA}(r,r+1)\),则修改就是将深度 \(>u\) 的设为 \(u\),就是一段后缀,可以并查集维护,修改次数线性,同时需要区间加区间历史和线段树。

考虑怎么求有多少个点的子树有区间 \([l,r]\) 的点,将 \(u\) 子树内的点按照编号排序,那么 \([l,r]\) 一定是在两个编号中间的。

反过来考虑,就是对每个点,处理出这个东西,然后在每个空隙中,执行矩形加。

那么树上启发式合并即可,搞出 \(\mathcal O(n\log n)\) 次矩形加,询问就是矩形查询。

离线下来做两遍扫描线即可,(其实一遍也行)

375.mx5

A

容易发现下界是在最大的一半数和最小的一半数插空取到。

如果 \(n\) 是偶数,只有最大的一半数在奇数位,最小的一半数在偶数位,就是合法的,那么答案就是 \(2(\frac{n}{2}!)^2\),如果 \(n\) 为奇数,还需要考虑多出来中间的那个数的位置,那么答案是 \(2n(\frac{n-1}{2})^2\)​。

B

我是弱智。。

\(A\le B\),每个怪兽如果要击杀的话就要尽早击杀。所以我们在原图上 bfs,求出到达每个点的最小天数,判断它能不能被击杀,如果此时不能那么因为已经是最小天数了,以后就都不能了,就不能从这个点继续遍历了。

\(A>B\) 同理,记 \(dis_i\) 表示到达 \(i\) 的最小天数,同时预处理出 \(w_i\) 表示击杀 \(i\) 的最早时间,那现在相当于我们要安排一个遍历顺序,使得可以到达 \(i\) 的最小天数,且被击杀的点的时间都满足大于等于最早时间,且每一天都要击杀人。

那么对于边 \((u,v)\),可以进行松弛 \(div_v \leftarrow \max(w_v,dis_u)+1\),条件是如果没到时间可以取补充能量,直到第 \(w_v\) 天,这个东西很模糊,不好刻画条件。

题解给出的做法是,先模拟一遍,按照当前所有出点的右端点排序,每次取出最小的限制,要求当前时间要大于等于这个限制,即每次优先攒钱,如果这样都不能到达 \(n\),就不合法,否则可以,然后直接按照上面的松弛就好了,无需判断条件,可以理解为如果 \(dis_u<w_v\),那么我可以攒钱直到时间 \(w_v\)(怎么攒呢?这个小连通块一定被大联通块包含,那么可以直接攒钱,太妙了!!),否则直接松弛。

时间复杂度 \(\mathcal O(n\log n)\)

C

如果 \(|t|>r-l+1\),那么中点在 \(t\) 上,只需要询问 \(t\) 的前缀的出现次数即可。

否则,中点在 \([l,r]\) 上,等价于先反向匹配 \(t\) 的一个前缀,再查询以某个点(endpos 集合)为右端点的回文串个数,manacher 预处理即可。

D

考虑如果找到最大 mex

性质:最大 mex 为最大的 \(x\),满足 \(\sum_{k=l}^{r}[a_k<x]\ge x\)

证明:如果 \(\sum_{k=l}^{r}[a_k<x]<x\),那么前面肯定填不满,后面的东西也无法补充到前面,因为如果补充了,那么 \(x\) 必定有数,不满足 mex 的条件。

发现无需考虑 \(a_x=0\) 的条件,因为最大的满足的一定满足 \(a_x=0\),否则,就有更大的了。

直接莫队,值域线段树维护这个限制,\(\mathcal O(n\sqrt n\log n)\)

考虑区间互不包含的情况,即左右端点都单调,从大到小扫值域,预处理出限制,\(x\) 变小,删除 \(a_i=x\) 的贡献,发现包含 \(a_i\) 的区间是一段区间,直接区间加即可,每次找到合法的区间就将其删除。

发现如果一个区间包含令一个区间,那么这个区间的答案就是那个区间的答案大,也就是说,我们可以实时维护当前没有被任何区间包含的区间进行上面的操作,每次删掉一个数,就将新的没有被任何区间包含的区间加入,一定是可以的,实现的时候查询一个右端点区间的最小左端点即可找到。

时间复杂度 \(\mathcal O(n\log n)\)

鸽子的彩灯!!!!

诶,鸽子的彩灯和这题都没写代码,真审了。

376.序列(sequence)

钦定有 \(k\) 个上升(注意是钦定,就是至少),那么等价于将序列划分为 \(n-k\) 段,每一段内部严格上升,如果确定了每段内部数的集合,就能构造这个排列。

先对空段进行容斥,\(g_k=\sum_{j=0}^{n-k}(-1)^j\binom{n-k}{j}\prod_{i=1}^{n} \binom{n-k-j}{cnt_i}\)

然后反演即可,设 \(f_k\) 表示恰好 \(k\) 个上升的方案数,那么 \(g_i=\sum_{j=i}^{n}\binom{j}{i}f_j\),于是 \(f_i=\sum_{j=i}^{n}(-1)^{j-i}\binom{j}{i}g_j\)

为什么 \(g\)\(f\) 是二项式关系呢,因为 \(g\) 算的是,划分 \(n-k\) 段的方案数,对应了一种钦定,对应了至少 \(k\) 个上升。

注意到 \(cnt\) 至多 \(\mathcal O(\sqrt n)\) 中,先预处理,然后快速幂,可以证明时间复杂度为 \(\mathcal O(n\sqrt n)\),等价于 \(\sum i\times b_i=n\),最大化 \(\sum \log_2(b_i+1)\),这是 \(\mathcal O(\sqrt n)\) 级别的。

转移就卷积优化即可。

377.有向图(graph)

image

这个结论容易证明。

P7712 [Ynoi2077] hlcpq https://www.luogu.com.cn/problem/P7712

欸,这两个题做法完全不同,我认为是不是互相转化的,P7712 这题找的是无向图的割点。

void tar(int x){
	int c=0,i=he[x],j;
	for(dfn[x]=low[x]=++id;i;i=ne[i])if(!dfn[j=to[i]]){
		tar(j),++c,low[x]=min(low[x],low[j]);
		if(low[j]==dfn[x])f[x]=1;
	}else low[x]=min(low[x],dfn[j]);
	if(x==r)f[x]=c>1;
}

这这题找的是,强联通分量。

void tarjan(int u) {
    s.push(u);
    dfn[u] = low[u] = ++cnt;
    for(int v : d[u]) if(!dfn[v]) {
        Debug(u, v);
        tarjan(v);
        low[u] = min(low[u], low[v]);
    } else if(!Id[v]) low[u] = min(low[u], dfn[v]);
    if(dfn[u] == low[u]) {
        ++cntn;
        while(1) {
            int nw = s.top();
            s.pop();
            Id[nw] = cntn;
            sz[cntn]++;
            bel[cntn ] = (nw <= n);
            if(nw == u) break;
        }
    }
}

注意到什么没有??有对 Id 的修改,P7712 那题没有,所以可以隐式地建边,查全局 \(dfn\)\(\min\)

但是这题,就不能这么做了。

观察题解。

实际上,该问题是可以直接线段树优化建图的。对线段树上每个区间,维护区间内

  • 矩阵上为 \(0\) 的位置的入树;

  • 矩阵上为 \(0\) 的位置的出树;

  • 矩阵上为 \(1\) 的位置的入树;

  • 矩阵上为 \(1\) 的位置的出树;

用扫描线处理修改操作,打标记时就是交换 0,1 位置的对应树,上传信息时需要新建结点。

在上传的时候新建节点,可以将一坨东西的边弄出来,且不会影响联通性。

感性理解新加的点是不会影响缩点结构的。

378.决斗(duel)

观察到问一个点是否可能获胜,就是在笛卡尔树上不断往上跳,每次拿自己权值加上子树大小减一与父亲比较,如果可以就跑到父亲上,要求 \(1\) 可以跑到根,\(0\) 不能跑到根。

那么就是区间 dp 笛卡尔树了,但是从下往上不好考虑,如果从上往下就很好考虑了,对于点 \(u\),上面的点带给他一个有边界的限制,还有左边界的限制,表示如果小于左边界,就无法到根,如果 \(\ge\) 左边界,就可以到根,很好转移了。

379.在 OI 中更易上手的线性规划对偶

  • 将最优化目标转成 \(\min\) 的形式。
  • 将所有限制转化成 \(\le 0\) 的形式。
  • 针对每一条约束设一个变量 \(\lambda_i\),将每一条约束的左边乘上对应的 \(\lambda_i\) 然后加到你的最优化目标上去,并在开头加上 \(\max\)
  • \(\lambda_i\) 添加限制,将其堪称一个博弈游戏,外层玩家操作 \(\lambda_i\),内层玩家操作 \(x_i\),为了防止内层玩家到达 \(-\infty\),可以依此来得到关于 \(\lambda_i\) 的约束。\(x_i\ge 0\to \lambda_i \ge 0\),对于 \(x_i\le 0\)\(x_i\) 无限制的特殊限制,我们同理可以导出它们对应的约束分别是非正、\(=0\)
  • 整理成关于原变量的形式,即 \(x_i\)
  • 刚刚只是完成了变量的约束,还有具体式子的约束,将关于原变量的部分从最优化目标中拆下来,转化成约束,也是要满足防止内层玩家到达 \(-\infty\)
  • 最优化目标变成外层玩家的目标。
  • 学废了。

359.zkw线段树上找前驱后继

int fdpre(int x) {
    int v = mx[x += N];
    for (; x; x >>= 1) if (x & 1 && mx[x ^ 1] >= v) { x ^= 1; break; }
    while (x && x < N) x = x << 1 | (mx[x << 1 | 1] >= v);
    return x && mx[x] == v ? x - N : 0;
}

385.CF2020

386.CF1630

gugu

posted @ 2024-09-03 09:08  蒟蒻orz  阅读(29)  评论(0编辑  收藏  举报