记录(4)
彩绘
设 \(f(i,j)\) 表示 \(i+1\) 个桶,第 \(j\) 个桶的系数。\((0\le j\le i)\)
则有 \(f(i,j)=\frac{j-1}{i}f(i-1,j-1)+\frac{i-j-1}{i}f(i-1,j)\),\(1\le j<i\);
边界 \(f(0,0)=1\)。
当 \(j=0\) 或 \(i\),发现上面的递推同样成立,只要定义 \(f(i,-1)=0\)。
考虑 \((i,j)\) 到 \((0,0)\) 的转移路径,向下/向左,走一步会附带一个系数,系数是定的,只需要统计路径数。
一般难度的推式子题
双射:欧拉回路,向下 ( 向上 )
dyck 路:
记住这个形式:
\(d\) 是上下两条红线间距。注意要转成不能碰的线,\(d\) 要变成 \(d+2\)。
\(\sum_k C(2(n-1),a+kd)-\sum_k C(2(n-1),b+kd)\)
其中 \(a,b\) 是和起点、终点坐标差有关的常数。
Chords
圆上的弦 -> 断环为链,变成区间
枚举连通块左右端点 \(l,r\),不能有跨过内外的边,计算区间在内部连边使 \(l,r\) 联通的方案数,容斥,用总的方案数减掉枚举一个 \(p\),实际上只联通到 \(p\) 的方案数。
Sightseeing Plan
TODO
Random Kth Max
TODO:感受一下用 min-max容斥避免积分的做法
\(\sum_t Pr[X>t]dt = E[X]\)
\(n^4->n^3\):\(t\) 是真正的值,而不是 \([0,1]\) \(f_i(t)=k_it+b_i\),是定的,左端点乘右端点除。
Guess the Number
做法1
在 \(X\) 后面补 \(0\),扩成 \(10^7\sim 10^8\) 的数。
二分,判断 \(X\ge Y\):构造最小的 \(t\),\(tY\ge 10^{16}\),看 \(t*X\) 的首位是不是 \(1\)。
做法2
对于 \(x=1...\sqrt n\),\(\left\lceil\frac nx\right\rceil\) 互不相同:\(\frac nx-\frac n{x+1}> 1\)
知道结果是 \(s\) 反解 \(x=\frac{n-1}{s-1}\)(最大的 \(x\))整除分块的结论 必须背过
Yes or No
做法1
在折线图上看非常显然。
做法2
策略显然是猜剩余更多的那个数。假设两种分别剩余 \(N,M\),那么猜 \(\max(N,M)\),如果猜对了,说明 \(\max(N,M)\) 一定减少 \(1\)(除非 \(N=M\));如果猜错了,说明 \(\max(N,M)\) 不变。那么猜对的次数显然是 \(\max(N,M)\)。当 \(N=M\),有 \(1/2\) 的概率猜对了但是 \(\max(N,M)\) 不变,这里少算了 \(1\),所以做一个修正,枚举 \(N=M=k\) 补上经过 \(N=M=k\) 的概率。
Forbidden Tournament
引理1
将所有强连通分量按顺序排成一排,则只有最后一个强连通分量大小可能 \(\ge 3\)。
剥去前面的孤点,不妨假设整张图强连通。
引理2
\(1\) 的入点和出点分别构成一条链。
对于入点:如果有 \(\ge 3\) 的强连通分量,则说明一定有三元环,进而会出现不合法子图。
对于出点:找出最后一个强连通分量 \(S\)。因为假设整张图强连通,因此 \(S\) 内必然会连到第一条链上的一个 \(x\)。同时至少有一条从 \(x\) 连向 \(S\) 的边,因为如果全都连到 \(x\),\(S\) 中的一个三元环加上 \(x\) 就不合法。若 \(a\to x,x\to b\),不能有 \(b\to a\),否则 \(1,a,b,x\) 违反条件。因此两部分之间的边只能由一边指向另一边,就与 \(S\) 强连通矛盾。
引理3
把两条链拉到上下两行,分别叫做 \(X_1,...,X_a=1\) 和 \(1=Y_1,...,Y_b\)。
对于 \(X_k\),一定存在 \(Y\) 的一段前缀 \(X_k\) 指向 \(Y_*\),一段后缀 \(Y_*\) 指向 \(X_k\)。取出第一个 \(X_k\to Y_i\),\(Y_{i+1}\to X_k\),那么必须是 \(X_k\to Y_{i+1}...\),同时因为第一个,所以 \(Y_1...\to X_k\)。对于 \(Y_k\) 同理。
引理4
由上两条性质,对于邻接矩阵,\(X_i\to Y_j\) 叫做 \(1\),那么行连续 \(1\) 单调,列连续 \(0\) 单调。因为如果行不单调,说明存在
...11..
...10..
\(Y_j\) 先 1 后 0 就矛盾了。对于列,同理。
Spanning Trees of Interval Graph (线性代数)
设总点数 \(S=\sum C_{ij}\)。根据矩阵树定理,答案为 \(D-A\) 去掉第一行第一列后的行列式。假设就是行列式好了。
\(\det D-A\)
\(=\det D\det I-D^{-1}A\) --------------\(\det AB=\det A\det B\)
考虑对 \(D^{-1}A\) 做低秩分解,假设 \(D^{-1}A\) 可以分解为 \(S\times N\) 和 \(N\times S\) 大小的 \(u,v\) 相乘,\(N\) 比较小。
则:
\(=\det I-uv\)
\(=\det I-vu\) ----------------矩阵行列式引理:\(\det I_n-uv=\det I_m-vu\)。
于是我们只需要计算一个 \(N\times N\) 矩阵的行列式即可。
那么问题来了,如何分解 \(D^{-1}A\)?先分解 \(A=uv\),则 \(D^{-1}A=(D^{-1}u)v\)。
点减边。拆成 \(2N-1\) 列,\(1,2,...,12,23,...\)。计算点积就等于两个区间是否有交。注意 \(u\) 是点减边,\(v\) 是点加边。
去掉第一行第一列,相当于删掉第一个点,但是度数保持不动。

Deque Sort
\(n\) 轮以内可以排序:考虑最长的 \(...,n-1,n\) 的后缀,每次操作后最末一个必定归位。
进行若干轮后的形态一定都形如:一段递减段,中间乱序,一段递增段。不妨假设 \(a_n\ne n\)。一次操作会选择递减段的开头,中间一些数(因为 \(a_n\ne n\),不会选择递增段)。操作后递增段变到递减段,选出的数前面刚好拼上递减段作为新的递增段。每次暴力找到前缀最大值,并及时排除 \(a_n=n\),那么取出的数总和是线性的。使用平衡树维护(不用split)。
Nezzar and Chocolate Bars
先考虑 \(n=1\)。计算 \(m\) 轮仍然没有结束,即存在一个间隔 \(>d\) 的概率,对 \(m\ge 0\) 求和。容斥,\(\sum_{k=1}^{\infty}(\frac{l-kd}{l})^{m}C(m+1,k)(-1)^{k-1}\)
(为什么是 \((\frac{l-kd}{l})^{m}\)?这里有一个双射,但是只有双射还不行,要不改变概率密度,因为不能有伸缩,而这里只有平移。)
Yosupo's Algorithm
找出所有支配对。分治,把 \(y\) 的条件去掉。结论:对于一定会选红/蓝最大值。假设没有选最大值,那么考虑如果红最大在区间内,或着蓝最大在区间内,可以替换为对应的最大值。否则同时替换为两个最大值。
注意分治是用来找支配对的,而不是用来回答询问的。
找到所有支配对,再做一个二维数点。
Permutation Recovery
考虑知道的所有信息。\(i\to p_i\) 连边后,一条边就会对应一条反向边,正反匹配起来,变成一条无向边。这张图就是所有的信息了。
图上每个点的度数为 \(2k\)。先给边定向,使得每个点入度等于出度等于 \(k\)。拆点,求一个 \(k-\)正则图的 \(k\) 组匹配即可。
如何定向:
方法1
让一条边,要么去匹配 \(u\) 的入度,要么去匹配 \(v\) 的入度,左边是边,右边是点的每一个度数,求一个完美匹配。
方法2
求一条欧拉回路,按照经过的方向来定向。
Accommodation Plan
多次询问求一个点的 \(k\) 邻域大小,可离线。要求单 \(\log\)。
Where is the legend?
差分,合并两个相邻的 \(x x\)。
除掉 \(2\) 之后分组,每一组单独做。这样就可以假设每个数都是 \(2^k\) 了。倍增求一个 \(f_{l,k}\) 表示能不能把 \([l,r]\) 合并成 \(2^k\)。
Królewski bal [B]
形如求一个图的最大匹配,要么贪心匹配,要么就只能考虑 Hall 定理或最小点覆盖/最大独立集。
选取最大独立集做分析。那么选一个黑点,就不能选同一行同一列的白点了。相当于选出行的集合 \(R\) 列的集合 \(C\),\(R,C\) 里面的只能选白点,\(U\R,U\C\) 里只能选黑点。

左上方区域内的白点+右下区域内的黑点。
这里行列不独立,所以要拆一拆。\(R\) 的白点数 + \(C\) 的黑点数 - \(|R||C|\)。
假设确定 \(R\),那么对于每列是独立的,等于 \(\sum\max(c_j-|R|,0)\)。
假设确定 \(|R|\),而不是 \(R\),那么一定选择排序后 \(r_1,...,r_{|R|}\)。
修改 \(r\) +1-1,影响是一段后缀;修改 \(c\) +1-1,影响只有 \(|R|=c_j\)。
6月2日模拟赛
A
B
做法1
一个点是不是谷,实际上等于有没有向前的连边。
二进制分组,求出每个点的两个邻居的异或。
分别问一次 \(ST\),\(TS\),\(ST,TS\)取反,就能知道一个点连到 \(S,T\) 的边分别有几条。
还需要求出任意一条边。随便问一个排列,找到第一个不是第一个到的人,将这个前缀翻转,同理就可以问出另一条边。需要额外一次询问。
优化方法:改用三进制;直接枚举一条边 \(1x\) 解出来看对不对,省下最后一次询问;问出大致形态再随机。
做法2
考虑先求出一个极大的独立集 \(S\),那么问一个 \(S\) 中的点结果是有没有连到之前的 \(T\),并且是两两独立的,那么可以对 \(S\) 整体二分,求出连到的靠前的边。再反过来求出靠后的边。现在还剩 \(T\) 中的边,先问一次将 \(T\) 再划分为两个独立集,再进行上面的过程,求出匹配边。
还需要求出一个独立集,维护独立集里的点 \(S\) 和候选点 \(T\)。其他一定不在独立集的点可以放在最后,不影响。随机打乱 \(T\)。问 \(ST,TS\),如果 \(ST\) 有向前的边但是 \(TS\) 没有,说明连到了 \(S\),删掉这个点;如果 \(ST\) 没有,说明这个点是一个谷,且没有连到 \(S\),那么加入 \(S\);如果都有就无法确定,留在 \(T\)。这样经过 \(10+\) 轮就能找出一个独立集。
也可以随机问 \(TS\),把谷加进去,但是后期很难收敛,实测 \(30+\) 次也无法完全收敛。
随机化,不仅要考虑单次减少的比例,还要考虑收敛的速度。
C
timeismoney
一个离散的点集内 \(xy\) 最小的点一定是下凸壳上的某个点。
证明:考虑取两个点,将两个点连线上的所有的点都加入凸包,不影响答案,因为一段线段最优解一定取在某个端点(考虑 \(xy=t\) 第一次交这个线段)。因为凸包内 \(x\times y\) 最小的点一定在凸包边界上,所以删掉新扩充的点之后一定也取在一个原来的点。
或者说,这个点一定在下凸壳上,同时,如果在一条边上,不如调整到某个端点。于是一定在点集里,同时一定在下凸壳上。
将一条边视为一个向量,找到解集的下凸壳。
考虑分治找出 \(AB\) 之间的点。考虑 \(S_{\triangle ABC}\) 最大的点 \(C\) 一定在凸包内,将 \(S_{\triangle ABC}\) 化成叉积式,一定等于某个 \(Px+Qy\)。即点积 \((P,Q)\)。将每条边点积 \((P,Q)\),作为边权求一个 MST,同时记录原向量 \(C\),继续分治 \(AC,BC\)。
求出 \((1,0),(0,1)\) 两个边界点 \(A,B\),然后执行 \(AB\)。
6.4模拟赛
A
引理:若分别存在 \(r\) 红边、\(b\) 条蓝边、\(g\) 条绿边的生成树,\(r+b+g=n-1\),则存在三种颜色的边同时有 \(r,g,b\) 条的生成树。
维护三个生成树 \(T_r,T_g,T_b\),每次取出两个生成树,比如 \(T_r,T_g\),如果 \(T_r(b>),T_g(b<)\),那么可以在不改变 \(T_r(r=),T_b(b=)\) 的情况下调整 \(T_r,T_g\)。最终 \(T_r=T_g=T_b\)。
C
根号分治,对 \(t\le B\),直接暴力,分块平衡一下。
对 \(t>B\),先让每个点跳 \(B\) 层,删掉子树深度 \(<B\) 的点,剩下的叶子个数最多有 \(n/B\) 个。则可以分成 \(n/B\) 条链。一个询问是 \(n/B\) 次查询一个子树内深度 \(\le d\),编号 \(\le k\) 的点数。对编号再分块。散块暴力,整块长剖。
Master of Modular Arithmetic
如何简化思路:如果之前是倒着想的,把思路正着重新理一遍。发现对称性(01对陈)
充要条件:初始想等或者 \(b_i\) 不全相同,且 \(a_i\ne 0\)。构造时只要保证了这一条件,就是一定有解的。
如何把 \(a_i\) 变成 \(b_i\)
思路1 \(a_i\to ka_i,\%(ka_i-b_i)\) 问题:\(a_1\) 做着做着变成 \(0\) 了。
思路2 \(a_i\%(a_i-1),*b_i\) 问题:\(a_i=2\),\(a_1\) 结果巨大。特判太过麻烦,果断放弃。
思路3 \(a_i*(b_ia_i^{-1}\%M),\%M\)。问题:\(b_i=2a_i\)。解决措施:同时维护 \(a_1,a_2\)。
如何把 \(1 x\) 变成 \(y 1\)
思路1 \(1,x\to 1,kx\to y,kx\%y\),选择 \(k\) 使得 \(kx\%y=1\)。如果 \(x,y\) 不互质,就利用一个大质数做中间值。
思路2 可以把 \(x,y\) 变成较小的数(\(x\%m,y*m\),\(x*m,y\%m\))然后暴搜。
Chocological
首先 01 是对称的,不妨假设 1 的个数不超过 \(n\)。
同一列内可以任意移动,只关心目标状态每一列的人数,哪一行不区分。
倒着做。
希望得到尽量长的 \(1\),但同时需要维护前后缀的条件。贪心先让第一行从第二行中得到尽量多的 \(1\),根据是否有无法移动的 \(1\) 进行分类讨论。
Weird Chessboard
设 \(A_{i,j}\) 表示选没选,做一遍二维前缀和。
根据 \(A\) 做完二维前缀和还是 \(A\),列出方程 \(A_{i,j}=A_{i-1,j-1}+A_{i-1,j}+A_{i,j-1}\),即 \(A_{i,j}+A_{i,j+1}+A_{i+1,j}=0\)。
性质:上半三角一定全是 \(0\),对角线可以全填 \(1\)。只要确定 \(A_{n,j}\) 就能唯一确定整个矩阵。
目标要让 \(1\) 的密度达到 \(60\%\)。
在 \(A_{n,j}\) 随机的情况下约为 \(50\%\)。代入 \(110110110...\),此时密度基本达到了 \(0.6\)。进一步发现这个矩阵里有很大的纯白三角形,要是不小心切进去就不好了。因此生成 6000*6000 的矩阵,再从中选择最大的子矩阵。
Sequence Operation 1
做法1
打表发现一个长度为 \(14\) 的串一定可以用 \(11\) 步操作消除.由此有一个 \((11/14)n\) 的做法.
预处理长度较短的串,dp 出一个最优的将整个串分成较短的短的分段方式.事实证明根本无法卡掉.原因在于经过微小的扰动能产生很大的变化.
做法2
可以证明正确性的做法.
先把一个后缀 \(S\) 留在手里,考虑在其后追加一个长度为 \(7\) 的串 \(x\).我们希望 \(S+x\) 可以通过 \(5\) 次操作变为 \(y+S'\) 其中 \(y=22222\). 这里 \(S'\) 是一个可能包含很多状态的集合,同理 \(S\) 也是一个状态的集合.如果经此操作始终满足 \(S'\ne \emptyset\) 那么合法.
可以看作一个自动机,\(S\) 通过 \(x\) 的转移边变成 \(S'\)。从初始状态 \(S=U\) 开始迭代。如果永远迭代不完就证实一定有解。
Make SYSU Great Again IV
直观化:将区间 DP 的结构看作是凸多边形上的三角剖分。点有点权,代价是三角形定点点权乘积之和。
性质:最优解中一定选择最小-次小、最小-次次小的边。假设较小的三个分别是 \(a,b,c\) 较大的三个分别是 \(x,y,z\),若保证选择次小-次次小,还需满足 \(\frac 1a+\frac 1x<\frac 1b+\frac 1c\)。这个条件其实比较容易满足,可以忽略。
不妨取 \(a,a+1,a+2\)。\(a\) 是偶数时所有三角形都是偶数,不妨让 \(a\) 取一个奇数。此时解得 \(x,y,z\) 的下界,并从中减掉,可以解出 \(x,y,z\)。从小到大枚举 \(a\)。

浙公网安备 33010602011771号