Travel to BNDS
Travel to BNDS
前言
观察到 LYC_dspt 每天都会记录自己的卷题记录,我也要来。
于是之前没记录的就咕咕咕了。
虽说是卷题记录,但原则上只记绿蓝紫黑,并且会夹杂一些知识点和奇奇怪怪的东西。
另类游记
4.11 / Day 4
内容:lxl 激情树上 DS
P7124 [Ynoi2008] stcm
考虑按 dfn 分治,对于 [l,r] 的询问先把 [1,l) 和 (r,n] 填完,再对于跨过 mid 的询问维护双指针处理,然后分别递归处理即可,操作量 \(cn\log n\leqslant 4.5\times10^6\)。
4.12 / Day 5
内容:模拟赛
得分:100+40+40=180
atom 100pts
【模板】平衡树
max_ans = max-min (len = r - l + 1)
min_ans = max-min (len = 2)
generals 40pts
二分,考虑到最优方案时全局 max 和 min 被分到了两侧。判断 x 是否可行时,做四次判断,分别为 max 在左上角、右上角、左下角、右下角,贪心扩大到 max 所在区域最大,然后判断另一个区域是否合法。
money 40pts
神秘写挂,70 -> 40。
问题其实是不断加边,问边双缩点后的路径点权和。
使用 LYC_dspt 的神秘思想,考虑增加了一条非树边的影响,可以把贡献集中到链顶。查询的时候对于中间的链使用树剖线段树维护,对于顶端的链特判计入贡献即可。
这个好像是原,bzoj2959。
P5314 [Ynoi2011] ODT
每个节点开平衡树维护轻儿子,树链剖分维护重儿子,复杂度 \(n\log n\)。
卡常。卡了一万年才过的。
P7549 [BJWC2017] 神秘物质
板子。易得 max 时为 len=Len,min 时为 len=2,然后随便平衡树就好了。
笑死,atom 原。
P3933 Chtholly Nota Seniorious
二分,考虑到最优方案时全局 max 和 min 被分到了两侧。判断 x 是否可行时,做四次判断,分别为 max 在左上角、右上角、左下角、右下角,贪心扩大到 max 所在区域最大,然后判断另一个区域是否合法。
笑死,generals 原。
AT_joi2017ho_c JOIOI 王国 (Kingdom of JOIOI)
笑死,P3933 原。
P2542 [AHOI2005] 航线规划
反着来,变成加边和求树边数量,等价于树边权为 1,加边时链上边权赋为 0,之后就是裸树剖了。
P5773 [JSOI2016] 轻重路径
很神奇啊,树。
注意到一次删点只会修改 \(\log n\) 个点且在链上,在链上二分 \(sz_p<sz_{tp}\) 为必要条件,然后 check 一下。
P4396 [AHOI2013] 作业
rand 一道莫队来做,竟然是值域分块。
\(O(n\sqrt m+m\sqrt n)\),前面是莫队,后面是分块(需要离散才是 \(m\sqrt n\),不然是 \(m\sqrt V\))。
4.13 / Day 6
内容:计数
LGV 引理
怎么这么多符号啊,听不懂啊。
一句话概括:在有向无环图上,若 \(A_i\rightarrow B_{\sigma_i}\) 在不满足 \(\sigma_i=i\) 时方案数为 0(就是平面图),则不相交路径方案数=det(M)。
具体地,令 \(e(a_i,b_j)\) 为 \(a_i\) 到 \(b_j\) 所有路径的路径边权积之和。路径计数时可以取 \(w=1\)。
\[M=\begin{bmatrix} e(a_1,b_1) & \cdots & e(a_1,b_n)\\ \vdots & \ddots & \vdots\\ e(a_n,b_1) & \cdots & e(a_n,b_n)\\ \end{bmatrix} \]满足
\[|M|=\sum_{S:A_i\rightarrow B_{p_i},\forall i\neq j,S_i \cap S_j=\varnothing}(-1)^{\sigma(p)}\prod_{i=1}^nw(A_i\rightarrow B_{p_i}) \]证明的话就是证右式在 \(S_i\cap S_j\neq\varnothing\) 时,贡献为 \(0\),发现有交时可以选一个交点 \(P=(A_{i1}\rightarrow B_{j1})\cap(A_{i2}\rightarrow B_{j2})\),则 \((S_i=A_{i1}\rightarrow P\rightarrow B_{j2},S_j=A_{i2}\rightarrow P\rightarrow B_{j1})\) 这个方案满足 \(\operatorname {sgn}\) 相反,\(\prod w\) 相同,贡献抵消,总和为 \(0\)。容易发现这些方案是两两匹配的,所以总贡献为 \(0\)。
然后听到了一个题,qoj1262,但是限制太强了听不懂,但是对于一部分内容可以研究研究。
长度为 \(n\) 的序列 \(a\),每次操作为选择 \(i,j,i\neq j,a_i++,a_j++\),若最终序列为 \(b\),问操作序列方案数。
很明显容斥,但我自己是想不出来怎么容斥的啊。
令 \(t=\frac{\sum b}2\),考虑把 \(i\neq j\) 容斥掉,有
\[ans=\sum_{\{x\},2x_i\leqslant b_i}(-1)^{\sum x}\binom{t}{x_1,\cdots,x_n}\binom{t-2\sum x}{b_1-2x_1,\cdots,b_n-2x_n} \]组合意义是枚举对于 \(i\) 的不合法操作次数为至少 \(x_i\),枚举它,贡献是考虑这 \(x_i\) 些不合法操作的位置,乘上剩下的位置随意操作(无论合不合法),再考虑符号,加起来即可。
这其实是反演吧?\(x_i=0 \leftrightarrow x_i\geqslant 0\)。
回忆:二项式反演
\[f(n)=\sum\limits_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{n-i}\binom nif(i) \]\[f(k)=\sum\limits_{i=k}^n\binom{i}{k}g(i)\Leftrightarrow g(k)=\sum_{i=k}^n(-1)^{i-k}\binom ikf(i) \]此处为前者的形式,由于当 \(2x_i>b_i\) 时贡献为 \(0\),故形式一致。
LYC_dspt 找到了一篇 讲解行列式的文章。
P7112 【模板】行列式求值
考虑到若 \(a_{i,*}\leftarrow a_{i,*}+ka_{j,*}\) 则行列式不变,就像高斯消元那样。
化成下三角矩阵,由定义,\(|A|=op\times\prod_\limits{i=1}^n a_{i,i}\),因为其他排列都至少含有一个 \(0\)。符号考虑进行了几次行间交换即可,复杂度为高斯消元 \(O(n^3)\)。
CF348D Turtles
问题是 \(((1,2)\rightarrow(n-1,m),(2,1)\rightarrow(n,m-1))\) (点下称 \(A_1,A_2,B_1,B_2\))不交路径方案数,有两种想法:
- 容斥为全体减不合法,\(f(A_1,B_1)f(A_2,B_2)-f(A_1,B_2)f(A_2,B_1)\),注意到 \((A_1\rightarrow B_2,A_2\rightarrow B_1)\) 必有交,因此一定不合法。
- LGV 引理,左边为 \(f(A_1,B_1)f(A_2,B_2)-f(A_1,B_2)f(A_2,B_1)\),右边发现只剩 \((A_1\rightarrow B_1,A_2\rightarrow B_2)\) 了,因为剩下的都交,都不计入贡献。
P6657 【模板】LGV 引理
左边 \(O(n^3)\) 求值,右边只有 \(p_i=i\) 的时候有贡献,也就是答案。
诶,格路上的 LGV 右边是不是都是 \(p_i=i\) 啊?蛮有趣的。
P7736 [NOI2021] 路径交点
首先不难发现 路径交点数 等于 \(\sigma(p)\),然后要求的就是 LGV 引理的右边。
然后就是求行列式了,非常 ez。
4.14 / Day 7
内容:字符串
一晚上睡了 2h,其中有 6h 在与蚊子斗智斗勇,现在神经衰弱了。
题目很难。但学到了一个 trick。
一个文本串和若干个查询串,你可以离线对查询串建 AC 自动机,然后再做。
AT_abc216_h [ABC216H] Random Robots
题意转换:路径为 \((0,a_i)\rightarrow(n,b_i)\),只能 \((x,y)\rightarrow(x+1,y+1)\) 或 \((x,y)\rightarrow (x+1,y)\),不相交路径方案数。
上 LGV 引理,右边就是答案,那么算左边就好了。
发现 \(b\) 是不确定的。
由于一共就 \(10\) 条路径,值域也小,那么可以用行列式定义算 dp。
\(dp_{S,j}\) 表示起点集合为 \(S\) 的路径已确定,且 \(\max\limits_{i\in S}b_i=j\) 的方案数。
根据行列式,有
\[dp_{S,j}=\sum_{i\in S}\sum_{k<j}(-1)^{\sum_{j\in S}[j>i]}dp_{S\backslash\{i\},k}\binom {n}{j-a_i} \]前缀和优化可以做到 \(O(2^mV)\)。
P6727 [COCI2015-2016#5] OOP
进行处理:文本串 \(a\rightarrow a*a\),模式串 \(p*s\rightarrow s*p\),那么若 \(a\) 对 \(p*s\) 有贡献,就是 \(s*p\) 是 \(a*a\) 的子串且 \(|a|+1\geqslant |p*s|\)。
然后扔到 AC 自动机上就好了。注意可以在第一个 \(len\leqslant |a|+1\) 的地方停下然后标记,最后全树前缀和。
CF1801G A task for substrings
简单拆一下贡献,\(ans_{l,r}=ans_{[1,r],[1,r]}-ans_{[1,l-1],[1,l-1]}-ans_{[1,l-1],[l,r]}\),前两项是好做的,直接预处理前缀和然后就好了,关键在后面。
注意到这种串一定包含 \(t_{l-1},t_l\),考虑以这里为断点,枚举 \([i,l-1]\) \([l,j]\) 且拼接起来是一个模板串,注意 \(i\in[1,l-1],j\in[l,r]\)。
为了加速枚举,考虑建正反两个 ACAM,变成 fail 树上二维偏序,接下来就是 dfn 一下然后数点。
可惜我不会。
4.15 / Day 8
内容:消化专题
换上了蚊帐,睡饱啦!
AT_joi2021ho_d ロボット (Robot)
好难的题。
考虑建议一张新图来刻画两种方案的费用,这样的话就可以直接做最短路了。
第一种是直接翻转自己的颜色,那么建双向边 \((u,v,w)\) 即可。
第二种是翻转自己节点的同色边。考虑到需要将同色路径 \(u\rightarrow v\rightarrow w\) 计入最优费用,可以以 \(v\) 为中心建立虚点 \(v'\),对于 \(v\) 的同色出边的终点集合 \(S\) 和 \(u\in S\),建边 \((v',u,\sum\limits_{u'\in S}w_{u',v}-w_{u,v})\),再建边 \((u,v',0)\),这样就可以把这种情况刻画出来了。
别忘了本身就合法的情况,可以连边 \((v,v',0)\) 以实现 \(v\rightarrow v'\rightarrow u\) 这条路径费用为 \(0\)。
可以证明这样可以刻画出所有最优情况,跑最短路即可。
P4769 [NOI2018] 冒泡排序
神奇计数题。
首先,好的排列是最长下降子序列不超过二,也就是可以划分成两个上升子序列。
trick:在统计字典序大于 \(q\) 的排列数量时,可以变成枚举 \(i\) 计算 \(\forall j<i,p_j=q_j,p_i>q_i\) 的 \(p\) 的数量。
令 \(dp_{i,j}\) 表示已经确定了前 \(i\) 位满足前缀最大值为 \(j\)(\(i\leqslant j\)),后 \(n-i\) 位的填写方案数,满足最长下降子序列长不超过二。
在第 \(i+1\) 位,可以填:
- 后 \(n-i\) 位的最小值,贡献为 \(f_{i+1,j}\);
- 一个比 \(j\) 大的值 \(k\),贡献为 \(f_{i+1,k}\)。
其余填法均不符合限制。
可得 \(f_{i,j}=\sum\limits_{k=j}^nf_{i+1,k}\)。
计算答案时考虑使用上文的 trick,令 \(q_{[1,i-1]}\) 的最大值为 \(mx\),\(q_{[i,n]}\) 的最小值为 \(mn\),分类讨论:
- 若 \(q_i<mn\),明显不存在这种情况;
- 若 \(q_i=mn\),那么可以填 \([mx+1,n]\),注意到若 \(mx>q_i>mn\) 则不合法。
- 若 \(q_i>mn\),观察 \(q_i\) 与 \(mx\) 的关系,可以填 \([\max(q_i,mx)+1,n]\)。
综上,第 \(i\) 位在合法时的贡献是 \(\sum\limits_{k=\max(mx,q_i)+1}^nf_{i,k}=f_{i-1,\max(mx,q_i)+1}\),不合法时贡献为 \(0\)。
此时已经可以做了,但是计算 \(f\) 是 \(O(n^2)\) 的,考虑优化。
观察柿子发现其组合意义是从 \((i+1,j)\) 向上向右走到 \((n,n)\) 且与 \(y=x-1\) 不交的方案数,参考卡特兰数的组合意义推导,可得
\[f_{i,j}=\binom{2n-i-j-1}{n-i-1}-\binom{2n-i-j-1}{n-i+1} \]预处理即可,复杂度 \(O(n)\)。
CF1748E Yet Another Array Counting Problem
好玩题,简单题。
题目的意思是,对于 \(i<j\),若 \(a_i\geqslant a_j\),则 \(b_i\leqslant b_j\);若 \(a_i<a_j\),则 \(b_i<b_j\)。
建一棵笛卡尔树 \(O(\sum nm)\) dp 即可。
P3207 [HNOI2010] 物品调度
若干个环,每次贪心塞就好了。先贪 \(y\) 再贪 \(x\),并查集和数据结构维护一下就可以 \(O(n\log n)\) 了。
但是被我暴力过了。
P7407 [JOI 2021 Final] ロボット
看题目也知道是双倍经验好吧。
忘了点分治,来复习一下代码要点。
getrt(u,f),用于找到重心也就是这次的分治中心也就是根,注意有些点已经分治过了所以不走。getdis(u,...),用于计算本次分治的相关信息。calc(u,...),用于处理本次分治的信息并计算相关答案。solve(rt),用于分治,注意分治时应该按照重心分治(废话)。
有了这份清单应该就知道从哪里开始码了。
从联考群友偷来的 trick:
点分治本身需要合并 \(O(度数)\) 个子问题,这样会导致点分治的时候出现修改和询问交替,会升维度,可以对度数进行分治,即用哈夫曼树合并子问题来解决.
AT_cf17_final_j Tree MST
首先有一个 trick:
对于图 \(G=(V,E)\),要求其最小生成树,可以先拿边集的子集 \(V'\subset V\),求得答案为 \(V''\),再算 \(V'' \cup V\backslash V'\) 的答案。
证明类似于贪心或反证。
那么我们就可以点分治了,分治时若以 \(rt\) 为中心,那么算出所有点到 \(rt\) 的距离 \(d=w+dis\),取 \(d\) 最小的点与其他点所连的边便是该子图的 MST 了。
把所有这样的边搞出来,最后 kruskal 即可,是 \(O(n\log^2n)\) 的。
P2604 [ZJOI2010] 网络扩容
第一问是简单的。第二问,为了控制流量为 \(k\),新建一个点向源点流 \(k\) 然后跑最小费用最大流就好了。
给 xyd 出了个 T1:U423229(极其简单)
(然而想了我两天)
upd:被打回来了。
P4149 [IOI2011] Race
首先点分治,然后就是双指针维护看能不能拼起来长为 \(k\),可以开一个数组记录每棵子树的 min_len 和所有子树 min_len 的 mn, submn,再分类讨论即可。
注意别忘了只选一棵子树的情况。
CF1662J Training Camp
怎么这么喜欢做网格题啊。
首先你可以把权值取反变成求最小权值和,这样就可以和最小割对应起来。
考虑如何刻画限制,很妙啊!对于 \(a_{i,j}\) 找到 \(a_{i,j'}=a_{i',j}=a_{i,j}+1\),并连边 \((i,j)\rightarrow(i',j),(i,j)\rightarrow(i,j')\),然后 \(S\rightarrow(i,j)(a_{i,j}=1),(i,j)\rightarrow T(a_{i,j}=n)\),拆点之后求最小割(点权变成边权需要加 \(\geqslant n\) 才能保证割边数量正确)。
很妙啊,如果存在 \(S\rightarrow T\) 的这样的上升点序列说明不符合条件,反之就符合条件了!
4.16 / Day 9
内容:图论(最短路)
最轻松的一集!
蚊帐里面进蚊子了,大悲。
CF1442C Graph Transpositions
这题我会!一眼秒了!
发现当 \(k\) 大到一定程度的时候答案就只和 \(k\) 强相关了,听说这个程度叫 \(\log m\),我代了 \(20\)。因此分两部分做。
当 \(k\leqslant 20\) 时跑一个正常的分层最短路。当 \(k\geqslant 20\) 跑一个 \((k,\sum w)\) 的二元组最短路。然后就做完了,复杂度不知道,反正能躺着过。
P6029 [JSOI2010] 旅行
这题好难!不会一点!
什么是交换?就是把路径里 \(w_{max}\) 和路径外 \(w_{min}\) 交换才能使答案更优。怎么刻画呢?
我们发现,在答案的最短路里,整张图边权前 \(L\) 小的边一定都在答案里。
(废话)那我们可以枚举 \(L\in [0,m]\),此时我们只需要考虑比 \(L\) 大的边,比 \(L\) 小的边边权赋为 \(0\),可以最后再加上。
令 \(d_{u,y,z}\) 表示走到 \(u\) 这个点,将 \(z\) 条非 \(0\) 边权值变为 \(0\),走了 \(y+z\) 条 \(0\) 边的最短路,这可以直接最短路求,注意 \(y+z\leqslant L,z\leqslant K\)。
答案就是 \(\min\limits_{y,z}d_{n,y,z}+sum_L\),注意要加的是 \(sum_L\) 而非 \(sum_{y+z}\) 以防答案不合法。
P3266 [JLOI2015] 骗我呢
好难的题啊。
首先因为一行值域大小 \(m+1\) 又是长为 \(m\) 的严格单增序列,因此可以找到一个断点分成两部分。
考虑 \(dp_{i,j}\) 表示 \(a_{i,k}=\begin{cases}k,&k<j\\k+1,&k\geqslant j\end{cases}\) 的方案数,根据题目限制易得 \(dp_{i,j}=\sum\limits_{k=0}^{j+1}dp_{i-1,k}=dp_{i,j-1}+dp_{i-1,j+1}\)。注意 \(dp_{i,m}=dp_{i,m-1}\) 和 \(dp_{i,0}=dp_{i-1,0}\) 和 \(dp_{1,j}=1\)。答案就是 \(\sum\limits_{j=0}^m dp_{n,j}=dp_{n+1,m-1}\)
接下来是魔法。
扔到坐标系里,变形,变成格路计数,\(S:(1,0)\rightarrow T:(n+m,n)\) 且不与 \(A:y=x+1\) 和 \(B:y=x-m-2\) 相交。
如果是只有一条直线,那么是简单的。考虑两条直线借鉴这个方法。
比如,折线与两条直线相交顺序为 \(AABBABB\),发现如果我们只计算 \(ABAB\) 表示相交的次序而不考虑次数,这是不重不漏的。
而要减去的方案恰好等于 \(A\) 开头的加 \(B\) 开头的。
发现这个不好算,考虑如何算 \(A\) 开头的的和,也就是 \(A*\)。在一条直线的方法中使用了作 \(A\) 对称点 \(T'\) 的方式,来看看 \(S\rightarrow T'\) 是什么。也就是最后一定会与 \(A\) 交一次,可能还会与 \(B\) 交,也就是 \(*A(B)\) 的方案。其中 \(|*|=2k\) 的方案是我们需要加上的。那么如何减去 \(|*|=2k-1\) 的呢?考虑作 \(T'\) 关于 \(B\) 的对称点 \(T''\),看看 \(S\rightarrow T''\),发现是 \(*BA(B)\) 的方案。其中 \(|*|=2k-1\) 的方案是我们需要减去的。那么如何加上 \(|*|=2k\) 的呢?考虑作 \(T''\) 关于 \(A\) 的对称点 \(T'''\),看看 \(S\rightarrow T'''\),发现是 \(*ABA(B)\) 的方案。其中 \(|*|=2k\) 的方案是我们需要减去的。那么如何减去 \(|*|=2k-1\) 的呢?考虑作 \(T'''\) 关于 \(B\) 的对称点 \(T''''\),看看 \(S\rightarrow T''''\),发现是 \(*BABA(B)\) 的方案。其中 \(|*|=2k-1\) 的方案是我们需要减去的。
于是你发现是一个递归,并且相交序列长不会超过 \(n+m+c\),直接算即可。
4.17 / Day 10
内容:小明の图连通性
晚上失眠到一点。什么原因啊。
题好难啊。
CF1252D Find String in a Grid
对模式串建 ACAM,把每个极长 L 形串拉进去匹配,最后前缀和统计,复杂度是对的。
P6914 [ICPC2015 WF] Tours
注意到如果环 \(C_1,C_2\) 有交边集 \(T\),则 \(C_1\backslash T,C_2\backslash T,T\) 应分别满足要求。
则这个限制加强,若 \(T_1,T_2\) 分别是由上一条的运算拆出来的需要满足要求的边集且有交 \(T\)(显然是一条链),则交集和两个对称差也应满足要求。
注意到一个边集的子集全满足要求是本身就会自动满足,因此我们只需考虑最小的两两不交的边集们 \(\{T\}\) 即可,显然互相独立,答案便是 \(\gcd\limits_{T_i\in{T}}|T_i|\),因此现在我们要快速算 \(|T_i|\) 了。
若 \(E_1,E_2\in T_i\),则他们应当满足:
- 同不是桥,因为是桥就不在环上;
- 一条断了另一条就变成了桥,因为同在链上,两条都断至少有一个点与原图不连通。这同时也说明了只有同在一个 \(T_i\) 的边才会在此时变成桥。
跑 tarjan 依性质模拟即可。
P6658 边三连通分量
史。
发现一个边三可以不连通,但一定在同一个边双内。因此先找出所有边双,把问题放到一个边双内。
在一个边双内,若两个点不三连通,一定可以满足以下两种之一:
- 割一条树边和一条非树边,两点不连通;
- 割两条树边,两点不连通。
除此之外就在一个边三里了。
如果是情况一,找到一个点恰好被一条非树边覆盖,这一步可以随机异或哈希,然后断掉自己与父亲的边。
此时一个边双变成了若干个连通块,每个连通块内只需考虑情况二。
对于情况二,要删的两条树边的中 相对深的树边的相对浅节点 与 相对浅的树边的相对深节点 的非树边覆盖情况应当相同。注意到可能有多条树边满足该性质,每次选择最近的即可。删除时,中间的那一块便是一个边三了。注意最后剩下的节点们也应当归为一个边三。
4.18 / Day 11
内容:博弈
一点睡的。猜猜为什么。
唉,果然我不是好人吗。
博弈论的游戏们
注意到 2009 年贾志豪的论文讨论了大量博弈论的内容。
NIM 游戏
每次选一堆中的正数个,取不了输。
宝宝巴士,快乐启蒙!
翻棋子游戏
棋盘上有 \(n\) 个棋子,操作是选一个正面朝上的棋子,选一个与它同行同列且坐标小于它的棋子,同时翻转。操作不了为输。
本质是 \(2n\) 堆石子的 NIM 游戏。其中操作两个正面朝上的就是 \(x\rightarrow a\),操作一正一反就是 \(del\ x,a\),等价于 \(x\rightarrow a\)。因此和 NIM 等价。
阶梯 NIM 游戏
\(n\) 个阶梯,阶梯上有一些石子堆,每次移动可以把一堆石子中正数个挪下一个阶梯,阶梯 \(0\) 上不可移动。操作不了为输。
偶数阶梯上的石子与答案无关,因为你移多少我就移多少从而抵消。奇数阶梯上类似,等价于全部移到 \(1\) 以后开始 NIM 博弈。
K-NIM 游戏
同 NIM 游戏,但每次可以选至多 \(k\) 堆,每堆可以不同。当 \(k=1\) 时为原 NIM 游戏。
先手必败当且仅当 \(a_i\) 二进制表示后每一位 \(1\) 的数量都是 \(k+1\) 的倍数。
简单证明:
-
全 \(0\) 必败;
-
从必败到必胜:操作之后一定没法满足每一位 \(1\) 数量都是 \(k+1\) 的倍数。
-
从必胜到必败:从高到底考虑每一位,假设到了第 \(i\) 位,且高位均满足要求,且操作了 \(m\) 堆,这一位 \(1\) 的数量 \(\bmod (k+1)=x\)。
- \(x\leqslant k-m\),把 \(1\) 变成 \(0\);
- \(x > k-m\),则 \(k+1-x\leqslant k+1-(k-m)\),把 \(0\) 变成 \(1\)。
因此是可行的。
Anti-NIM 游戏 / Anti-SG 游戏
同 NIM 游戏,但取不了为胜。
先手必胜条件:
- \(\oplus=0\) 时要求 \(\forall i,a_i\leqslant 1\)。
- \(\oplus>0\) 时要求 \(\exist i,a_i>1\)。
证明考虑分类讨论:
- \(\forall i,a_i\leqslant 1\):此时只和堆数奇偶性相关了,满足条件 \(1\)。
- \(\exist i,a_i>1\):此时在分类讨论:
- \(\oplus=0\):(必败)显然至少两堆石子大于 \(1\),操作后至少有一堆石子大于一且 \(\oplus\neq0\)。
- \(\oplus\neq0\):(必胜)若至少两堆石子大于 \(1\),则操作使 \(\oplus=0\);若只有一堆石子大于 \(1\),可以全取或剩一个以控制堆数奇偶性。
注意到 Anti-SG 游戏胜负应当使用 Anti-NIM 规则判断,而非 NIM 规则。
Every-SG 游戏
同多子游戏 NIM 游戏,但是轮都一个玩家时对于每个未结束的子游戏都需要操作一次。
首先,对于一个子游戏,若先手必胜则先手要使其结束尽量晚;若先手必败则先手要使其结束尽量早。
因此可以对于一个状态节点 \(u\) 定义
先手必胜当且仅当 \(\max(step(rt_i))\) 为奇数。显然这么做是对的。
Multi-SG 游戏
Multi-NIM 游戏同 NIM 游戏,但是操作分为两种,一种是取石子,一种是将一个石子堆分裂成任意合法的两堆。
这个好难,但感觉不常用,直接放结论吧。
相比之下 Multi-SG 游戏会更常用些,例如在翻棋子游戏中。
这个游戏的 SG 求法为 \(SG(u)=\operatorname{mex}(\operatorname{mex}(v_i),\operatorname{mex}(\oplus w_{i,j}))\),其中 \(v\) 为 \(u\) 的后继状态们,\(w\) 为 \(u\) 通过分裂可以到达的后继状态们们。
Chomp 游戏
有一 \(n\times m\) 的棋盘,两人轮流操作,每次可以取走一个方格右下方的所有方格,拿到 \((1,1)\) 的玩家输。
先手必败当且仅当 \(n=m=1\)。因为对于非 \(n=m=1\) 的情况,假设先手必败,那么后手必胜。若先手选了 \((x,y)\neq(1,1)\),后手一定能选 \((x',y')\) 来保证最优策略。那么可以一开始先手就选 \((x',y')\) 来抢先进入必胜局面,矛盾,因此先手必胜。
欧几里得博弈
有两个数字 \(a,b\),两人轮流操作,每次可以用较大的数减去较小的数的倍数,若操作时较小的数为 \(0\),则操作者负。
设 \(a\leqslant b,b=ka+r\),分类讨论:
- \(r=0\),可以到达 \((0,a)\),先手必胜。
- \(r\neq 0,k=1\),有且仅有后继 \((b-a,a)\),递归处理。
- \(r\neq0,k>1\),考察 \((a,r)\) 的状态:
- 若 \((a,r)\) 必败,则先手必胜;
- 若 \((a,r)\) 必败,可以取 \((a+r,r)\),其只有一个后继状态 \((a,r)\),则先手必胜。
东西太多了,就记这些,多了我也不想看。题目遇到了再写吧。
但我找到了一篇 很牛的组合博弈文章。
P9394 白鹭兰
勾史题目,写了我一整天。
首先题目限制很迷。对其建立圆方树,可以发现一些很好的性质,比如要求的就是分成若干连通块,每个连通块缩成点后建圆方树是一条链。
那么我们就要在原图的圆方树上选一条链 \(s\rightarrow t\),使得剩下的每个原点连通块大小的最大值最小,不难想到贪心树形 dp。
一车细节啊啊那么第一问就做完了。第二问好难啊。
首先我们可以找到这条妙妙链,那么我们现在可以直接缩点然后确定每个连通块的加入顺序。
对于每个缩点后节点,维护一个列表 \(L_u\),每次我们删掉一个叶子 \(y\) 时就在 \(L_{low_y}\) 和 \(L_{fa_y}\) 中插入 \(y\)。意义在于当 \(fa_y,low_y\) 中有一方被染色时 \(y\) 将紧接着被染色,否则可能不连通。
那么我们染黑 \(u\) 时就顺序遍历 \(L_u\) 中的元素并染黑还没染的。
但注意到我们要求 \(t\) 最后被染色,而这一点没有被满足。我们可以将 \(s\rightarrow t\) 的路径单独拿出来,然后从 \(s\) 走到 \(t\) 边走边染。
这样就做完了,
是不是很史。一车细节啊啊听说这种做法叫双极定向,果然学不来啊。
P1290 欧几里德的游戏
喜报:过了道黄题
欧几里得博弈板子,一模一样的那种。
CF1498F Christmas Game
对于一个确定的根,每一层都是阶梯 NIM 游戏。把分层后的奇数层全部异或起来即可。
你要换根,那就换根。dp 即可。
P3179 [HAOI2015] 数组游戏
好萌耶
首先是翻格子游戏的结论,也就是白格子独立分开考虑。那么问题就是如何快速计算 sg 值。
注意到这很像 Multi-SG,故有 \(SG(x)=\operatorname{mex}(0,\operatorname{mex}_i(\oplus SG([2,i]\times x)))\)。
发现里面有 \(\lfloor \frac ni \rfloor\) 类似物质,观察到整除分块时在一个块里的数的 sg 相同。
那么我们只需要计算 \(O(\sqrt n)\) 个 sg 值就好了。但是单次计算还是太慢了。
怎么加速呢?再写个整除分块就好了。
复杂度应该是低于 \(O(n)\) 的,但我不会算。
好像说有整除分块时 \(r\) 值域包括 \([1,sq]\),\(\lfloor \frac nr\rfloor\) 值域包括 \([1,sq]\),感觉挺对的,但我
不会证会证了,随便反证一下就好了。
翻格子游戏
一排格子,可以以某些限制翻格子,但是最右边的格子一定是从正面翻到反面。
结论:整个游戏的 SG 值等于每个正面格子在只有这一个格子正面朝上的游戏中的 SG 值的亦或和。
不会证啊
考虑翻硬币变成拿走反面,放置正面。那么如果有一个位置有两个硬币他们会相互抵消。
因此只和哪些地方有硬币有关了,也即硬币们之间相互独立。
4.19 / Day 12
内容:模拟赛
怎么感觉暴力分这么多,好耶!
得分:75+65+35=175
stone 75pts
80 -> 75,无伤大雅。
找规律发现 \(sg(x)=\log_2 lowbit(x)\),那么我们可以预处理处值域内每种 sg 值的数量。sg 的规模是 \(\log n\) 的。
然后若干个子游戏合并,合并时可以倍增这样就只要合并 \(\log_2m\) 次了。我就写到这里,\(O(\log^2n\log m)\) 但过不了。
考虑在多项式乘法的时候使用 FWT 优化异或卷积,复杂度 \(O(\log n\log\log n\log m)\)。
听说 \(m\) 很大也能做,因为 \(f^{p-1}\equiv1\)(费马小定理)。
arcane 65pts
拿平衡树维护信息那么查询就是 log 的了。问题在于怎么修改。
赛时太蠢了,\(O(n)\) 修改的。事实上和可持久化平衡树操作没有区别啊!直接做就好了,注意空间,定期重构。
permutation 35pts
是不是一个 OIFC 题的弱化版。
写了 \(O(n^2)\) dp,拿了 35。但是听说分段打表可以到 55。
听说分治 FFT 可以做到 \(O(n\log^2n)\),有 85。
更高的做法好像就要用多项式和泰勒展开了,是我不会的,那就不研究了。
积累一个我并不会用的数学点:
\[2f'=f^2+1 \Leftrightarrow f=\tan(\frac x2+C) \]
P6791 [SNOI2020] 取石子
斐波那契博弈
一堆石子 \(n\),两个人轮流取,第一个人至少取一颗至多取 \(n-1\) 颗,之后每个人取的石子都不能超过上个人的两倍,谁取完谁胜。
首先有一些 Fibonacci 的性质。
\(f_{i+1}<2f_i<f_{i+2}\)
\(\frac43f_i<f_{i+1}\)
齐肯多夫定理:任意正整数可以被拆分为若干个不连续的 Fibonacci 数之和。证明的话 yy 一下即可。
我们有定理:石子个数是 Fibonacci 数时先手必败,且后手最后一手拿的 \(\leqslant \frac23n\)。使用数学归纳法:
- \(f_i\) 较小时易证;
- 假设 \(f_{[1,i-1]}\) 均成立,对于 \(f_i\),可以拆成两个子游戏 \(f_{i-1}\) 和 \(f_{i-2}\),先游戏 \(f_{i-2}\)。先手没法取完,不然后手一下就赢了。那么后手可以在这个子游戏中控制先手并取得胜利且最后一手 \(\leqslant \frac23f_{i-2}\),进入子游戏 \(f_{i-1}\),此时先手最多可以取 \(\leqslant \frac43f_{i-2}<f_{i+1}\),且这个游戏也是后手必胜的。所以先手死透了。
同时,石子个数不是 Fibonacci 数时就先手必胜了。
齐肯多夫拆分石子数 \(n=\sum f_{p_i},p_i+1<p_{i+1}\),那么先手取 \(f_{p_1}\),此时后手不能一次性取完 \(f_{p_2}\),因此在这个子游戏后手必败,后面的子游戏同理。
回到原问题,有一个先手不超过 \(k\) 的限制,那么我们就想 \(f_{p_1}\leqslant k\)。当 \(f_{p_1}>k\) 时第一堆取不完,很神奇地就变成后手必胜了。证明的话 yy 一下。
那么就变成数数了。
按题意模拟可爱数位 dp 萌萌好萌。
记忆化搜索!
AT_arc134_e [ARC134E] Modulo Nim
好难啊,可不可以出一点萌萌 sg 函数做的博弈啊。
竟然是神秘推理,是我学不会的。
首先相同的数合并,变成一个集合 \(S\)。
然后寻找性质。
首先有必胜 \(\varnothing\) 和必败 \(\{1\},\{2\}\)。
否则,若 \(S\) 中全为奇数且 \(S\neq \{1\}\) 则可以做一次 \(2\) 变成必败,因此必胜。
否则,若 \(S\) 中全为偶数,若不全为 \(4\) 的倍数,可以做一次 \(4\) 变成必败,因此必胜。
否则,\(S\) 中全是 \(4\) 的倍数。若做一次 \(12\),变成了 \(\{4\}\) 或 \(\{8\}\),那么可以一开始就做一次 \(3\) 变成必败,因此必胜;若变成了 \(\{4,8\}\),可以发现其为必败,因此还是必胜。
若变成了 \(\varnothing\),那么 \(S\) 中全是 \(12\) 的倍数,一共有 \(2^{16}\) 种不同情况,直接根据以上转移推导就好了。
计算方案数就是全体减去必败,因为你算不清楚哪些必胜。
4.20 / Day 13
内容:cml 手玩构造
都好难想啊!
AT_agc066_a [AGC066A] Adjacent Difference
好厉害。
注意到我们如果能把网格染色,黑格 \(\bmod 2d=k\),白格 \(\bmod 2d=k+d\),我们就达成条件了。贡献的话肯定有一个符合,枚举 \(k\) 就做完了。
当然我们也可以只取 \(k=0,k=d\) 两种情况,这两种情况的贡献和为 \(n^2d\),所以一定有一个满足条件。
CF1896G Pepe Racing
好可爱的构造。
首先我们可以分组,这样 \(n+1\) 次确定全局最大值和每组最大值。
接下来的大概步骤就是取每组最大值询问当前全局最大值然后删掉,对变化的组从别的组偷数进来,再查组内最大值,以此循环。
但这样是 \(2n^2-n+1\) 的,过不了。
发现最后的若干次询问是类似 \(\geqslant n\) 和 \(<n\) 一起问的,并且组内其它都 \(<n\),那你就没必要在组内查最大值了,因为查了也是白查,就是它自己。
这样是 \(2n^2-2n+2\) 的。观察到最后一次询问就是确定 \(n\),发现就是那个每组最大值。根本不用查。
那么就 \(2n^2-2n+1\) 了。
傻逼 UVa 交不了题,把我密码吃了。
谁下次再写 UVa 的题谁是狗。
FMT / FWT
用来计算位运算卷积的有力工具,是 \(O(n\log n)\) 的。
分不清 FMT 和 FWT 的区别,干脆全叫 FWT 得了。
对于长为 \(2^n\) 的序列 \(a,b\),求
每种位运算都有独特的处理方式,但思想是相通的。
或
构造 \(a'_i=\sum\limits_{j|i=i}a_j,b'_i=\sum\limits_{j|i=i}b_j,c'_i=\sum\limits_{j|i=i}c_j\),则
于是我们只需要 FWT 和 IFWT 就好了。
FWT(\(A \rightarrow A'\)):考虑分治,设一个长度为 \(2^i\) 的序列 \(a'\),将其分成左右两边 \(L',R'\),那么两边对应位置的下标区别仅存在于第 \(i\) 位上的 \(0,1\) 上。
令两边的子答案为 \(L,R\),有 \(L'_i=L_i,R'_i=R_i+L_i\)。
IFWT(\(A'\rightarrow A\)):类似 FWT,只不过是把过程逆过来,那么是一个解方程问题。
有 \(\begin{cases}L_i+R_i=R'_i\\L_i=L'_i\end{cases}\),解得 \(\begin{cases}L_i=L'_i\\R_i=R'_i-L'_i\end{cases}\)。于是就做完了。
注意到 FWT 和 IFWT 分治时父问题与子问题没有很强的顺序要求,因此正着做或者倒着做皆可。以下也是类似的。
与
与或类似,构造 \(a'_i=\sum\limits_{j\&i=i}a_j\) 等,算算 FWT 和 IFWT 即可。
FWT:\(L'_i=L_i+R_i,R'_i=R_i\)。
IFWT:\(L_i=L'_i-R'_i,R_i=R'_i\)。
异或
这个有些复杂。
定义 \(i \circ j=\operatorname{popcount}(i\& j)\bmod 2\)。
可以推理得到 \((i\circ j)\otimes (i\circ k)=i\circ (j\otimes k)\)。证明的话拆位就好了。
构造 \(a'_i=\sum\limits_{i\circ j=0}a_j-\sum\limits_{i\circ j=1}a_j\) 等。
可得
FWT:\(L'_i=L_i+R_i,R'_i=L_i-R_i\)。
IFWT:\(L_i=\frac {L'_i+R'_i}2,R_i=\frac {L'_i-R'_i}2\)。
做完了。
P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
好耶!过板子啦!又学会了一种卷积!
AT_agc043_c [AGC043C] Giant Graph
这种题真是太美啦!
虽然我不会做。首先注意到贡献中的 \(K=10^{18}\) 好大啊,说明直接贪指数最大的就好了,指数碾压一切!
又注意到不存在两个和相同的节点之间有边,直接贪心取即可。
优化过程,可以给边定向,小的连向大的,这样按照和从大往小枚举是只要看出点有没有被选就能判断自己能不能被选了。
发现这个过程和博弈论是一样的!必败节点就是选的点!
变成博弈,发现三张图互相独立了。那就独立。那也就是求 \(\sum\limits_{sg(x)\otimes sg(y) \otimes sg(z)=0}K^{a+b+c}\),这个可以直接卷积或者 FWT 优化卷积。
直接卷积时间复杂度是对的,因为有以下 trick:
一张有 \(m\) 条边的状态转移图的节点 sg 值是 \(O(\sqrt m)\) 级别的。
证明 yy 一下即可。
做完啦!
4.21 / Day 14
内容:模拟赛
得分:20+60+20=100
count 20pts
60 -> 20,神金。
首先把贡献拆开。一边用分治 NTT 做,一边建 SAM 做。反正我不会。
10 + 10,有点唐。
upd:你妈,哈希冲突了。
flag 60pts
有原,CF811E(弱化版),P7295(加强版)。
积累一个平面图欧拉公式的 trick:
\(V-E+F=C+1\),即点数减边数加面数等于连通块数加 \(1\)。
在相邻颜色连通块之间连边建图,转化为求 \(V-E+F\)。点数和边数是好做的,接下来是我不会的区域数。
平面图转对偶图,并查集统计每个连通块最左和最右延伸到哪里,可以扫描线+树状数组做。然后就好了。
tree 20pts
有原,CF1137F。
考场上推了一些性质出来,但是复杂度不对,只打了个暴力就跑了。
听说好像是 LCT 题。
CF811E Vladik and Entertaining Flags
flag 弱化版。
对 \(m\) 建线段树,因为 \(n\) 很小,用并查集暴力处理合并时的连通块减少量即可。\(O(qn\log n\log m)\)。
AT_arc164_f [ARC164F] Subtree Reversi
发现子树翻转是假的,只与深度有关。
那么就是贪心要自己放的偶数尽量多。
一开始肯定会选偶数层的叶子。那么会剩下一颗只有奇数层有叶子的树。
此时谁先手谁亏,那么先手就会取最短的一条链(簇)来改变先后手情况。
模拟即可。注意到处理簇时在偶数层合并(画图,单取一条不改变先后手关系),在奇数层取最长的一条(因为从短往长去,最长最后去,最后成为链向上延伸)。复杂度竟然是 \(O(n\log n)\) 的。不过看起来就像是跑得很快的那种。
P4093 [HEOI2016/TJOI2016] 序列
对于 cdq 分治有了更深的理解!
(天天做不可做题做傻了,这题就像是一股清流
首先容易发现转移的一些限制:
- \(j<i\)
- \(a_j\leqslant mn_i\)
- \(mx_i\leqslant a_i\)
搞个三维偏序做完了。
原来 cdq 这么强大!发现要先做左子问题再做本身再做右子问题,是可以的!
发现偏序的两个数组不同,也是可以的!对于第二维偏序,左边保证左边有序,右边保证右边有序,双指针即可!
四边形不等式
其实就是交叉小于包含。
若 \(f_i=\min f_j+w(j,i)\),我们要快速求解 \(f\)。
四边形不等式:\(\forall a\leqslant b\leqslant c\leqslant d,w(a,c)+w(b,d)\leqslant w(a,d)+w(b,c)\)。
有结论:\(w\) 满足四边形不等式,则 \(f\) 也满足四边形不等式。
有结论:满足四边形不等式的 \(f\) 具有决策单调性。证明考虑反证或 OI wiki。
有了决策单调性就可以 \(O(n\log n)\) 二分单调队列决策了。
具体地,从左往右 dp,单调队列记录每个决策点控制的一段区间。注意到这些区间的不交并是未决策的状态集合。
每加进来一个状态,先扔掉过时的决策点,然后更新状态的答案。之后我们要把这个状态作为决策点算出它控制的区间。
先从后往前扔掉那些自己控制的左端点都没有新状态优的,那就寄了。
然后可能会遇到一个状态,右端点新的优,左端点自己优。那么需要二分出来分界线,然后更新这两个状态,再将新状态入队就好啦!
4.22 / Day 15
内容:数学
太难了,根本听不懂,弃了。
P7295 [USACO21JAN] Paint by Letters P
前面和昨天的 flag 是一样的。但是求 \(F\) 就不能静态了。
LYC_dspt 大法好啊!太强了!
考虑转成对偶图,求连通块数量。考虑把每个连通块的权挂在某个点上做前缀和,那么每次询问时就是总的减去点在范围内但不合法的,这些不合法的一定有部分在边缘,扫一遍判断即可,复杂度 \(O(nm+q(n+m))\)。
P1912 [NOI2009] 诗人小G
题解写的几坨,根本没有启发意义。
容易得到 \(f_i=\min f_j+w(j,i)\),其中 \(w(j,i)=|s_i-s_j-L|^P\),根据他人推导和自己 yy 均可得出其满足四边形不等式。
然后就是板子了。名曰四边形不等式优化 1D / 1D 类 dp。
CF1137F Matches Are Not a Child's Play
发现对于一次 up u,上一次 up 的点为 v,则 u 到 v 的路径被提了出来,移到了权序列最后,其他点相对性不变。
那么我们可以维护每个点属于哪条链,答案就是所有链底比自己链底小的链大小之和加上自己离链底的距离。前者可以 LCT+BIT 维护,后者 LCT 顺便维护即可。
4.23 / Day 16
内容:愉快返程
LYC_dspt 高铁上还在卷题,卷不卷啊。
停时定理
好厉害的定理,反正我是不懂的。
对于随机事件序列 \([A_0,A_1,\cdots]\),\(T\) 是停时,欲求 \(E(T)\)。
考虑构造势能函数 \(\phi(A_i)\),要求满足如下条件:
- \(\phi(A_T)=C\),即终止局面势能唯一。
- 在 \([A_0,\cdots,A_t]\) 结果已知时,满足 \(E(\phi(A_{t+1})-\phi(A_{t}))=-1\),可以理解为相邻时间内期望离开起点距离为 \(1\)。
那么,我们有:
- \(E(T)=\phi(A_0)-\phi(A_T)\)。
CF1951G Clacking Balls
使用停时定理,构造 \(\phi(A_i)=\sum\limits_{i=1}^k f(a_i),\sum a_i=n,\forall a_i\neq0\),其中 \(a\) 为相邻两个球之间的距离,\(k\) 为活着的球的数量。注意到可能会选到死了的球,令 \(f(0)=0\) 便可以解决。
根据 \(E(\phi(A_{t+1})-\phi(A_t))=-1\),可得方程:
\[\begin{aligned} \sum_{i=1}^kf(a_i)&=1+\frac 1k\left(\sum_{i=1}^kf(a_i+1)+f(a_{i+1}-1)+\sum_{j\neq i,j\neq i+1}f(a_j)\right)\\ k\sum_{i=1}^kf(a_i)&=k+\sum_{i=1}^kf(a_i+1)+\sum_{i=1}^kf(a_i-1)+(k-2)\sum_{i-1}^kf(a_i)\\ 2\sum_{i=1}^kf(a_i)&=k+\sum_{i=1}^kf(a_i+1)+\sum_{i=1}^kf(a_i-1) \end{aligned} \]接下来是魔法时间。
构造差分,令 \(g(x)=f(x)-f(x-1)\),有 \(\sum\limits_{i=1}^kg(a_i)=k+\sum\limits_{i=1}^kg(a_i+1)\)。
构造差分,令 \(h(x)=g(x+1)-g(x)\),有 \(-k=\sum\limits_{i=1}^kh(a_i)\)。
发现 \(h(x)=-\frac{kx}n\) 是一个可行解。那就构造完了。
则 \(g(x)=\sum\limits_{i=0}^{x-1}h(x)=-\frac kn\sum\limits_{i=0}^{x-1}i=-\frac{kx(x-1)}{2n}\)。
则 \(f(x)=\sum\limits_{i=1}^xg(x)=-\frac k{2n}(\sum\limits_{i=1}^xx^2-\sum\limits_{i=1}^xx)=-\frac k{2n}\left(\frac {x(x+1)(2x+1)}6-\frac {x(x+1)}2\right)=-\frac kn\cdot\frac {x(x+1)(x-1)}6\)。
注意到我们算的是 \(\Delta f\),也就是离散求和,则 \(f(x)=-\frac kn\cdot\frac {x(x+1)(x-1)}6+C\)。
又 \(f(0)=0\),则取 \(C=0\)。
注意到 \(E(T)=\phi(A_0)-\phi(A_T)=\sum\limits_{i=1}^mf(d_i)|_{k=m}-f(m)|_{k=1}\),于是我们就做完了。
Goodbye BNDS.

浙公网安备 33010602011771号