记录(7)
线性卷积
只会循环 \(N\) 次。加训纸笔。与其觉得是神经乱搞或不可做题,不如相信他能用常规的方法构出来。
应该主动考虑两两配对/分两半/两个一组,等等
绝对不应该考虑解方程,矩阵满秩/插到线性基里线性无关
信息量分析
\(1\) 的信息永远是 \(0\);\(2...N\) 的信息总和永远等于总边数的奇偶性,因此每一轮回复的信息量最多是 \(N-2\),加上边数奇偶性,设问了 \(k\) 轮,则有 \(k(N-2)+1\ge N(N-1)/2\)。即 \(2k(N-2)+2\ge N(N-1)\),即 \(2k(N-2)\ge N^2-N-2\),后面可因式分解为 \((N-2)(N+1)\),所以 \(k\ge \left\lceil\frac{N+1}2\right\rceil=\left\lfloor\frac{N}2\right\rfloor+1\)。
做法1
先考虑 \(N\) 是偶数。
1 2 3 [4] [5] 6 7 8
5 1 2 [3] [6] 7 8 4
6 5 1 [2] [7] 8 4 3
7 6 5 [1] [8] 4 3 2
8 7 6 5 4 3 2 1
进行 \(N/2\) 轮,每轮将中间两个数取出,靠前的扔在最后,靠后的扔在最前。对于左边的数,两次询问只有和被取出的靠后的数的位置关系发生了变化,因此将两次的异或得到靠后的数的连边。对于右边是对称的,两次询问的变化只有靠前的数被扔到了自己后面,因此求一个异或就能知道和靠前的数的连边。每轮得到 \(N-2\) 条边,只要 \(N\) 轮不重复就能得到恰好 \(N(N-2)/2\) 条边,事实上得到的边恰好是 8 7 6 5 1 2 3 4 每个数和前面 \(N/2\) 个的连边,确实不会重复。缺的 \(N/2\) 条边恰好是 1-8 2-7 3-6 4-5 这样的边,通过第一次询问的 1 2 3 4 5 6 7 8 可以直接确定。
再考虑 \(N\) 是奇数。将 \(N\) 插在每一轮序列最前。对于 \(1\sim N-1\) 之间的连边仍然可以确定,还可以 \(N\) 和 \(N/2+1\sim N-1\) 的连边,进而确定匹配边和 \(N\) 和 \(1\sim N/2\) 的边。
麦田
一个数至多被操作一次:操作一次后肯定会出现两个相邻相等的,就成对死掉了。
无论按什么顺序操作都能得到相同的结果:。
\(nq\) 做法:按照从小到大的顺序依次操作每个数一次。
按照这个做法继续推,可以发现,对于一个数,找到左右唯一的破坏单调性且 \(>a_i\) 的位置,如果存在,\(i\) 最终会变为 \(\max(a_l,a_r)-a_i\)。
对于询问是一个二维数点,带 log;因为 \(l,r\) 都是单调的,因此复杂度线性。
分披萨
考虑怎么判定。枚举每一段的数字种类数 \(v\)。dp,\(f_{i,j}\) 表示前 \(i\) 个数能不能完整分 \(j\) 段,可以发现固定 \(j\),\(i\) 的取值是一段区间,设为 \(L_j,R_j\)。
证明:
归纳证明,当 \(j=1\) 时,因为种类数关于 \(i\) 单调,所以肯定是一段区间。
只需要证明接上一段后仍然是一段区间。
左端点应该是 \(L_j\) 接上尽可能短的,左端点应该是 \(R_j\) 接尽可能长的。
假设可以到 \(p\),只需要证明可以到 \(p+1\)。
如果直接接在最后一段后面种类数不会增加,显然得证。
否则移动左端点直到去掉一种数字。如果移动到 \(R_j\) 都至少有 \(v+1\) 种数,而 \(R_j\) 到 \(R_{j+1}\) 至多有 \(v\) 种数字,矛盾。
发现:\(v\) 的取值唯一。
考虑第一段有 \(R_1<R_1'\)。归纳,假设 \(R_{j+1}\ge R_{j+1}'\),更短的区间内包含了更多的数,矛盾。
因此 \(n=R_k<R_k'=n\),矛盾。
发现:\(L,R\) 指针的移动是独立的。答案可以拆为 \([L_k\le n]-[R_k<n]\)。分别统计。前一部分可以做到 \(n^3\)。后一部分关系到下一段的第一个位置,而这个位置又会牵扯到下下个,因此必须记录开头的数,这个数只有 \(n+1\) 种可能。枚举段头和段头的取值,转移到下一段的开头,只有两种本质不同的开头。
直接 dp 的复杂度为 \(n^2\)(枚举段的两个端点)\(k\)(记录分段数)\(n/k\)(枚举段颜色数)\(n\)(枚举下一个段的开头元素)=\(n^4\)
字符串
noi 那个题的思路:比较原串和反串的字典序本质就是在比较前缀和后缀,除非串是回文串。
border group 后缀的前缀回文串形成了 border 嵌套的结构。
这个题的扩展思路:考虑人为设定比较长度 \(k\),对于长度在 \([k,2k]\) 的串的比较结果都是对的。
那么只需要取 \(k=1,2,4,...\)。现在的问题就和随机性质分类似了,只和前后缀字典序有关,扫描线线段树维护。
另一件事:对 \(2\) 的幂后缀排序本质上就是 SA 的中间结果。
\(O(n\log n+(n+q)\log^2 n)\)。考虑到本质不同的查询只有 \(n\log n+q\) 种(散的 \(q\) 个,整的对于每个 \(k\) \(O(n)\) 个)。记忆化后复杂度达到 \(O(n\log n+q\log^2 n)\)。
黑幕
考虑如何判定是否可以完全消除。可能会想比如不存在值域切分点之类的东西,实际上条件只有 \(p_1\le p_n\)。证明使用归纳,一定存在一个 \(p_i<p_{i+1}\) 的位置,任意丢掉一个非 \(1\) 和 \(n\) 的位置上的数。
有了这个条件,就可以 dp 合法的分段方案。有结论一定是先进行代价为 0 的操作,再进行代价为 1 的操作。否则找到第一次对进行过代价 1 操作后再进行代价 0 的操作,整个段可以用代价 0 的操作完成。
深搜 2
枚举根,充要条件是不存在横叉边。可以直接算出固定一个根的答案,加起来会算重。考虑猜测合法的根应该类似一个连通块之类的结构,具体的应该是边双或者点双上的一个连通块。
不妨先考虑如果原图是点双联通。如果有两个点同时作为根合法,考虑这个两个点间的路径,分出去的支链一定无连到主链上的边,因此接点一定是割点,矛盾。所以如果两个点都是合法的根,这棵树一定退化为连接这两个点的哈密顿路。
再考虑一般情况。缩点双抽象为一个仙人掌。由每个点双内部独立选出一个生成树。由之前得到一个点双内部至多有两个合法的根。如果容斥的点集中有三个不共链,那么考虑交点处的点双至少要有三个合法的根,矛盾。因此点集是一条链,使用点减边,用钦定一个点的方案数减去钦定一个点双内两个点的方案数。
数据结构
\((n^2+q)\log^2\):对笛卡尔树上的子树做二维数点
如果一段区间满足两段比中间小,这一段一定是笛卡尔树上的一段区间。
Slime Farm
期望概率类 dp 的通用方法:设 \(f,g\) 表示期望和概率,转移分两类:
乘法公式 \(g=g_1g_2,f=f_1g_2+g_1f_2\)
加法公式 \(f=f_1+f_2,g=g_1+g_2\)
定义一个 struct{f,g},定义叉积运算和加法运算。
长剖的两种写法:
- 只维护一个全局标记 \(t\),对于 \(len'\) 以内的部分暴力改完之后复合上 \(t^{-1}\),要求 \(t\) 可逆;
- 线段树维护区间复合,带 log;
- 将 算法2 中的线段树改为链式的结构,修改前缀时只将修改的部分向后 pushdown,反过来向前 pushup。
如果你确定一道题是很大的 dp,直接上矩阵手法,把转移往矩阵的方向凑,dp->ndp 转移过程中不要用 ndp 再做转移,不要嫌麻烦,把转移全部写开也不会很长。
本题中的一个小技巧:如果转移有这种
,以及对 \(i\) 的偏移
把 \(idp_i\) 加进向量里,而不是加 \(i\)。
本题中的另一个小技巧:你的 \(n^2\) dp 不要提前钦定子树深度,而是枚举每个儿子做 max 卷积。前者不可避免的要记 0/1 表示有没有取到这个深度的,或者对 \(\le k\) 容斥,后面做不了,前面得多记 0/1。
交互题
图排列
手玩 \(K_4\) 不合法,不含的 \(K_4\) 图也就是广义串并联图。
考虑分析一个环的限制,这已经很紧了,环上的点只能顺逆时针排。考虑在上面加一些边,如果边有交叉就无解,否则没有影响。考虑加一条边插一个点,发现一定无解。再手玩两个环交于一点,也是有解的。删掉每个环上面挂的边,原图变成一个仙人掌。众所周知仙人掌类似于缩点双,对图做点双分解,每个环代表一个点双,每个点双一定都是广义串并联图,进一步一定有一条哈密顿环,用广义串并联图的方法配合链表可以找出这个哈密顿环。删掉多余的环上边后转为仙人掌的情况。
先考虑仙人掌的退化情况,树。首先 \(p_1=1\)。可以推出每个点的序列等于这个点和儿子序列的字典序最小拼接。对应到仙人掌上就是一个圆点的拼接方式。对于一个方点,可以推出等于扣掉上一个点后依序的拼接,取顺时针拼接和逆时针拼接里字典序最小的那个。可以归纳证明:一定不会出现两个共点的环互相嵌套。即 
二次整数规划问题
加入两个松弛变量 \(x_{n+1}=1,x_{n+2}=k\),把变量取值的限制也转成绝对值的限制。
如果一个点取到了 \(1\) 或者 \(k\),且不是唯一的取值,调整到 \(2\sim k-1\) 里一定更优。
因此每个变量只有 \(k-2\) 种取值,直接爆搜复杂度 \(3^n\)。
绝对值的限制很好用切糕建模,相当于绝对值大于了就会付出 \(+\infty\) 的代价。还有对两个变量相差不超过 \(1\) 的 bonus,转成绝对值 \(\ge 2\) 就有 \(10^6\) 的代价。然后还有单个变量的 bonus,转成 \(x_i\) 取 \(j\) 有 \(-v_{ij}\) 的代价。这是多项式的,但每次询问都要重跑一遍 \(4n\) 个点 \(n^2\) 条边的网络流。
正解是另一种思路。对于一种解,只关心 \(2,3,4\) 的个数,假设各有 \(x,y,z\) 个,有 \(x+y+z=n_0\),就可以表示为一个向量 \((x,y)\)。查询很类似于一个向量和解集向量点积的最值,只有解集的凸包上的 \(O(n)\) 个点是有用的(注意凸包可能退化)。使用分治面积法的 trick 找到在凸包边界上的点,只需要查询在解集中和给定向量点积最大的向量。每次的网络流边数降到了 \(O(n)\)。查询可以直接枚举凸包上的点,也能二分??
[NOI2022] 冒泡排序
字符串
Dreamgate
先考虑没有 234 操作,那么答案为选一条路径的反边扣掉,其他边正反走两次。
如果有传送回 1,那么考虑使用传送的点,考虑这些点构成的虚树,不在虚树上的边至少要正反走一次,再加上所有叶子到根的深度。
如果可以设置传送门。我们可以说明:如果一个点被作为传送点,那么它的祖先一定可以被作为传送点,换句话说,在这些点每次进入时将其设为传送点一定不劣。考虑从一个点建立传送门到传送回这个点,传送门失效的时间段。这些时间段可以被任意插入到传送点的任意一次经过时。可以说明:一定不会走到传送点的祖先,因为这样不如在祖先处(也是传送点)再被访问到。因此只需要考虑传送点构成的虚树,对这个虚树外的其他子树都求出当子树根为传送点,不能再使用传送门,也就是只有 12 操作的子问题的答案。
dp 记录子树内选了 \(j\) 个点,可以把贡献拆到每一条边上。归纳说明 dp 是一个凸包:合并儿子相当于做闵和,加入自己相当于和 \(\{0,0\}\) 闵和,加分段函数 \(a+b,x=0,bx,x>0\) 是一个凸函数,所有操作都保持凸性,因此 dp 也是凸的。维护差分数组,可并堆/set 启发式合并(据说常数很小),对于第一项单独维护。对于查询凸包最低点,末尾差分 \(>0\) 的可以扔掉,因为后面一定不可能再成为最小值。
Digital Counting Problem
and 非零的限制可以直接容斥成没有限制减 and=0.二的幂的部分分,算出来每一段的系数后,需要把一些段组合成一个环。一种理解是先拼成序列,再把开头插在第一段的某个位置(\(a_1\) 种方案数)。生成函数的角度的小结论可以记下来,等于 \(\frac{F'}{1-F}\)。
如果从高到低 dp,一些没有 \(<b\) 限制的数,状态可能形如开头结尾都已经确定 \(<b\),里面目前 \(=b\),这样里面是确定的,外面却是不确定的,很别扭。如果从低到高 dp,也就是将刚才的过程倒过来变成删掉不确定的数,加入确定的数,状态是一段两端确定里面不确定,就能表示一个独立的子问题。另一种方式,考虑画一个柱状图,每一行的长度 \(l_i\) 为和 \(b\) 的 lcp 长度。考虑 \(l_i\) 最大值,删掉,归为两个子问题。
The Tree
做法1
一个神奇的定量观察:令 \(s_i\) 表示 \(i\) 到根路径上的黑点数目,则一次操作 \(x\) 会令子数内的 \(y\),\(s_y<-\max(s_x,s_y-1)\)。
可以对01序列前缀和打表,能看出来一次操作就是找到第一个平台,把后面的部分整体向下偏移 \(1\)。
这样的好处是直接将这道题转化为了一个序列上的数据结构题。原题只有单点修改,可以用线段树维护,设计标记 \((A,B,C)\) 表示把每个 \(a_i\) 变为 \(\max(a_i+A,dep_i+B,C)\)。
这个题就考虑直接大力分块。能让代码好写的技巧:每一块选取一个基准序列,就是在上一次重构时已经定的序列,如果遇到赋值操作对整块赋值为 \(dep_u+x\),如果这个块的基准序列不是 \(dep\) 就暴力重构。复杂度不变。
做法2
Go Swap
Easy ver
假设已经得到了猜测:答案为 \(\frac12\sum |i-p_i|\)。首先答案不小于这个值。然后只需要证明任何局面一定有至少一种办法使势能的减少量刚好等于操作的代价。介值定理,开头结尾都满足,中间一定能满足。
Hard ver
考虑猜测同样存在一个势能,那么应该满足删掉一个 \(p_i=i\) 后势能保持不变。在 easy ver 的基础上令势能为 \(\sum|i-p_i|\),为了保持不变可以解出势能为 \(\sum|i-p_i|-inv\)。
证明同样可以介值定理。
线段树
先不画全全部的点,而是每次递归到左右两半的时候再画出中点,形成的结构是一个三角剖分。
考虑子树 dp,叠三角剖分的过程类似于 toptree 的 rake/compress,dp 状态应该包含到左右两个界点的信息,里面的点都被会缩掉。对于 \(l_i=0,r_i=i\),等价于求出任意区间和,等价于图联通,一个簇内的信息只有两种:整个子树联通;整个子数分为包含 \(L\) 和包含 \(R\) 的两个联通块。

浙公网安备 33010602011771号