2025.9
注意到没有 2025.8,因为太摆了。
学 OI 太累了,九月份还是继续摆吧。
嘟嘟嘟嘟嘟嘟哒哒哒哒哒哒哒哒吱吱吱吱吱吱吱吱嘿嘿嘿嘿嘿嘿嘿嘿我是一个爱摆烂的小宝宝哈哈哈哈哈哈哈哈哈哈咦咦咦咦咦咦咦咦咦呼呼呼呼呼呼呼呼呼噢噢噢噢噢噢噢噢
AGC065A Shuffle and mod K
不难发现设 \(a_{i+1}<a_i\) 的位置数量为 \(x\),则答案为 \(a_n-a_1+xk\),先不去考虑 \(a_n-a_1\),最大化 \(xk\)。直接的构造是每次从每种数中选一个排成下降序列,设众数频数为 \(y\),这样会有 \(y-1\) 个位置不满足 \(a_{i+1}<a_i\),容易证明这是下界。接着考虑 \(a_n-a_1\),注意到 \(-k<a_n-a_1<k\),因此需要考虑有 \(y-1\) 或 \(y-2\) 个位置不满足 \(a_{i+1}<a_i\) 的情况,我只考虑了前一种,所以这场过了 \(0\) 个题。第一种情况是简单的,第二种情况也是简单的。
AGC065D Not Intersect
惊世骇俗题。存在二元 GF 拉格朗日反演做法,我看不懂。
考虑一个我从来没有见过的组合意义,对于 \(i=1\to n\),每次弹出栈的若干个数,再压入若干个 \(i\),此过程与允许重边的合法图形成双射,记总边数(也即入栈数)为 \(k\),方案数为 \(g_k\)。若能求出 \(g_k\),考虑有 \(g_k=\sum\limits_{i=0}^k\binom{k-1}{i-1}f_i\),和二项式反演的形式很接近。
点击查看 Southern_Dynasty 神威
考虑 \(g_n=\sum\limits_{i=0}^n\binom{n-x}{i-x}f_i\),令 \(g'_{n-x}=g_{n}\),\(f'_{n-x}=f_{n}\),则有 \(g'_{n-x}=\sum\limits_{i=0}^{n-x}\binom{n-x}if'_i\)。二项式反演后 \(f'_n=\sum\limits_{i=0}^n(-1)^{n-i}\binom{n}{i}g'_i\),于是 \(f_n=\sum\limits_{i=0}^{n-x}(-1)^{n-x-i}\binom{n-x}ig_{i+x}\)。
将 \(f\) 和 \(g\) 向前平移即可。充分体现了 Southern_Dynasty 神威。
将 \(g_k\) 的求解放到二维平面上,即要求出如下问题:
每次向 \(y\) 轴正方向走若干步,再向 \(x\) 轴正方向走若干步,从 \((0,0)\) 走到 \((k,k)\),不能跨越 \(y=x\),花 \(n\) 步的方案数。
考虑每次停下来的位置 \((a_i,b_i)\)。直接刻画限制需要满足 \(a_i\ge b_{i-1}\),不好做。注意到第一步不会向上走,最后一步不会向右走,于是可以视为每次先向右再向上走 \(n-1\) 次,限制可以很好地刻画为:
- \((a_0,b_0)=(0,0)\),\((a_{n-1},b_{n-1})=(k,k)\)
- \(a_i\leq a_{i+1}\),\(b_i\leq b_{i+1}\)
- \(a_i\geq b_i\)
注意到首尾确定的不降序列唯一确定了一条从 \((0,0)\) 到 \((k,n-2)\) 的路径,于是即为求路径对 \((P,Q)\) 的数量使得 \(Q\) 低于 \(P\)。每一步两条路径的走法组合为 \((0,0)\),\((0,1)\),\((1,0)\),\((1,1)\) 中的一种,实际上为在四维空间上行走且不触碰到一条直线的方案数。由于 \((0,0)\) 和 \((1,1)\) 不会影响路径的大小关系,同时二三种走法的次数必然相同,于是枚举这个次数 \(i\),第一种走了 \(n-2-i\) 次,第四种走了 \(k-i\) 次。要求任意前缀第二种数量都大于第三种,写出式子:
其中 \(H_i\) 代表卡特兰数。这个式子乱化一下可以 \(O(1)\) 算。这样做仍然是 \(O(m)\) 的。但是注意到 \(m\leq 2n-3\),考虑最大化 \(m\) 即为将所有点连成多边形以后做三角剖分。于是时间复杂度 \(O(n)\)。
再来一个双射,考虑 \(i:2\to n\) 的如下过程:
- 加入 \(j\)。
- 选择正整数 \(k\),弹出栈顶 \(k+1\) 个数,将 \(j\) 与当前栈顶连边,栈为空则 \(j\to1\) 连边,再将 \(j\) 加入,重复任意多次。
注意到这样是没有重边的,但是忽略了 \((i,i+1)\) 这种相邻边。这种相邻边看上去就比较好处理。套用 Raney 定理即可。
Landau's Theorem
设 \(s_i\) 是竞赛图每个点出度从小到大排序后的结果,那么 \(s\) 对应一个竞赛图的充要条件是:
并在 \(i=n\) 处取等。
强连通分量数就是取等的数量。
P7470 岛屿探险
先来考虑 \(d<b\) 的部分,此时是 01trie 入门题。
再来考虑 \(b<d\) 的部分,去统计一个询问中有多少位置爆掉了。一个位置爆掉可以用 \(\log\) 个 \(01\) 串(低位是通配符)描述,代表若高位匹配上了这些 \(01\) 串就爆掉了,同时这些 \(01\) 串没有包含关系,于是可以 \(2\log\) 解决。
上面的部分分在诱导我们对 \(bd\) 的大小关系进行讨论,考虑都是全局询问的情况。将询问离线下来按照 \(d\) 排序后考虑每个位置对询问的贡献,扫描线即可。这实际上是一个一维数点。加上区间的限制后是个三维数点,于是考虑类似的做法,分治一下也做完了。时间复杂度 \(3\log\)。
上面对于 \(b<d\) 的处理有别的做法。考虑 \(b<d\) 和 \(d<b\) 实际上是对称的,将每个位置贡献到询问上即可,这部分是 \(1\log\) 的,于是总共 \(2\log\)。
P8043 KLAVIR
做这道题完全是因为 Petit_Souris 的题解写的非常有意思:link。
考虑存在赌徒和赌场,每次赌博过程中,赌徒付出赌金 \(b\) 元,赌场进行一次独立的试验,根据试验的结果返还赌徒 \(a_i\) 元。若每次赌博期望收益为 \(0\),那么赌博是绝对公平的。
证明,直觉上感觉很对就行了。据此,本题中全体赌徒的期望额外收益为 \(0\)。
P4313 文理分科
考虑如下问题:
存在两个集合 \(A\) 和 \(B\),需要对 \(1\sim n\) 进行决策。若 \(i\) 被分到 \(A\) 会产生 \(a_i\) 的代价,否则产生 \(b_i\) 的代价。同时另外给出若干个集合 \(S_k\),若 \(H_k\) 中的数没有全部分到 \(A\) 集合则产生 \(c_k\) 的代价。要求最小化总代价。
认为 \(a,b,c\geq0\)。考虑一个数分到两个集合中的一个类似于最小割,从此出发考虑,连边 \((S,i,b_i)\),\((i,T,a_i)\)。这样在不存在额外约束的情况下,\(i\) 连的两条边会被恰好割掉一个,对应将其分到某一个集合中。网络流考虑这种约束的常见角度是,若违反该约束,会产生如何的代价。对于每个约束建虚点 \(v\),建边 \((S,v,e_k)\);对约束内的点 \(i\) 建边 \((v,i,\infty)\),此时若违反约束(即存在数被分到 \(B\)),那么需要割掉 \((S,v,e_k)\),产生 \(e_k\) 的代价。
dinic 在特殊图上的时间复杂度:
- 一般图 \(O(n^2m)\)。
- 一般图 \(O(nm\sqrt{\sum_p\min(d_p^{in},d_p^{out})})\),其中 \(d_p^{in}\) 是进入 \(p\) 的容量,\(d_p^{out}\) 是从 \(p\) 出去的流量。
- 边权为 \(1\),\(O(m\min(m^{\frac12},n^{\frac23}))\)。
- 单位网络,边权为 \(1\),且每个点的入度或者出度不超过 \(1\),\(O(m\sqrt n)\)。
回到这个题,最大化贡献显然不好做,考虑转化为最小化代价,dinic 即可。若干个命题全部满足会有一定贡献可以转化为某个命题不满足会有一定代价,最小化代价即可。不严谨地分析一下复杂度,利用上面第二个结论可以得到 \(O(nm\sqrt{nmV})\) 的上界。
如果 \(a_i,b_i<0\),容量为负数的最大流并不好做。考虑将 \(a_i,b_i\) 加上 \(\delta_i\),此时由于 \((S,i,b_i)\) 和 \((i,T,a_i)\) 恰好有一条被割掉,因此答案会多算 \(\sum\delta_i\)。
P2762 太空飞行计划问题
每个仪器只有选或不选两种状态,一个子集全部选上会有一定贡献,要求最大化贡献。直接转化为最小化代价即可。考虑构造方案,最大流自然为我们提供了一组最小割,做完 dinic 后 \(S\) 在残量网络上可达的点就是一个集合,其余点是另外一个集合,割边就是两边在不同集合中的边。
最大权闭合子图
考虑如下问题:
定义闭合子图是一个导出子图 \(G'\),设其点集为 \(V'\),则 \(V'\) 的所有出边仍然指向 \(V'\) 内部。一个子图的权值是子图内点权之和,求最大权闭合子图。
最大化变成最小化,一个点不选会有 \(w_i\) 的代价。那么直接利用文理分科模型处理关系。
代码源 NOI 集训 day6t2 蚂蚁集合
命令由蚂蚁而不是点发出显得有些奇怪,这实际上告诉我们,每轮操作后会有叶子数量个点没用。我们的目标是强化叶子数量:
若一棵 \(n\) 个点的树没有二度点,则叶子数量 \(\geq\frac n2\)。
注意到一串二度点做操作很容易用统一的形式维护。将二度点缩起来,用链表维护一串二度点,那么操作无非是取出一个数、加入一个数。由于每次操作后叶子都会被删掉,因此有用操作次数是 \(O(\log n)\) 的。每次操作后还需要将二度点缩起来。时间复杂度分析一下是 \(O(n)\) 的。
编程兔 NOIP 集训 day8t4
区间加,区间赋值,查询区间权值。一次操作定义为选择一个数 \(x\),\(x\to\lceil\sqrt x\rceil\),一个序列的权值是最少操作次数使得所有数相同。
考虑连边 \(x\to\lceil\sqrt x\rceil\),形成了一棵树。那么权值有两部分,需要求出区间内深度和以及区间 LCA 的深度,前者是容易的。考虑如何求 LCA。注意到同一深度的点被编号最小和最大的点支配,于是有用的数只有 \(O(\log\log V)\) 个。线段树维护即可。
P11364 树上查询
我从来没有正赛赛后补题的习惯,因此 NOIP2024 的后两题一直都没去做。晚上回家的时候感觉自己 NOIP 没什么拿高分的道理,回家以后尝试做了一下这个题,大概有了一个能看的做法,复杂度应该是 \(2\log\)。其实挺烂的,赛后从别人的游记中看到过“支配对”,于是自己想到这一点以后就觉得对完了,直接往支配对继续想了,赛场上肯定不会这样。
直接考虑询问不好做,从答案的角度考虑。若答案不小于某个深度,意味着存在一个长为 \(k\) 的连续段和一个该深度上的点,连续段在这个点的子树内。如果通过 dsu on tree 求出所有连续段,那么支配对数量上界是 \(O(n\log n)\)(实际上是 \(O(n)\) 的)。找出支配对以后每个询问会有三种限制,其中一种是三维偏序,于是直接做就是 \(2\log\)。
想到这就没有下文比没想到这可恶多了。显然三维的限制不一定要分治,扫描线可以自然扫掉一维,然后惊人地发现就剩一维限制了,时间复杂度 \(O(n\log n)\)。
这题正赛能过我吃。
P2805 植物大战僵尸
首先容易发现,可以将约束建图,缩点之后所有可达一个 \(>1\) SCC 的点都不可以包含,此后直接做最大权闭合子图即可。注意一定不能有负容量的边。
P3227 切糕
考虑如下问题:
有 \(n\) 个整数变量 \(x_i\in[1,V]\),\(x_i=c\) 的代价为 \(f_{i,c}\)。给定 \(m\) 条限制,每条限制形如 \(x_i\leq x_j+d\)。求满足所有限制的最小代价。
\(f\) 可以非常简单地转化为全为非负数的情况。考虑如何刻画每个变量恰为一个值的要求。对于每个变量连一条长为 \(V\) 的链,如果能使最小割恰好割掉链上一条边就可以了。增加一条边权为 \(\infty\) 的反向链,容易发现此时必然是一段前缀和 \(S\) 在同一个集合,后缀和 \(T\) 在同一个集合。
对于限制,实际上是当 \(x_j=c\) 时,\(i\) 那条链上割掉的边要在 \(c+d\) 前,从 \(c\) 出发向 \(i\) 那条链的一段后缀连长度为 \(\infty\) 的边即可。点数 \(O(nV)\),边数 \(O((n+m)V)\)。
2025炼石计划 #3 T3.数列涂色
注意到答案为 \(\rm{LIS}+\rm{LDS}\) 或 \(\rm{LIS}+\rm{LDS}-1\),因为两者最多有一个交。所有方案中可能存在两类方案,判定某类方案是否存在。这个问题比较经典,对于另一类方案统计总数即可。钦定一个点是交后可以直接统计。
CF1474F
有点难了。第一问容易。
第二问按照下标从左往右扫进行 dp 看上去非常困难,因为总是要记值域上的一些东西,而值域在下标这个维度上显得比较离散。考虑统计 LIS 数量对值域的限制实际上是非常严格的,首先要递增,然后必须连续;而在下标的限制比较松,只需要递增即可。因此考虑从下往上扫描值域。
具体地,对于每个折点 \((a,b)\),画一条 \(y=b\) 的直线,我们将两两相邻折线之间的部分称作值域段;类似,同时画一条 \(x=a\) 的直线,将两两相邻折线之间的部分称作下标段。从下往上扫描每个值域段。先来感受一些东西,如果当前值域段需要选数,可以发现一定是尽可能选满当前值域段,不然会造成 LIS 在值域上的不连续。
自然或不自然地设计出一个 dp,令 \(f_{i,j}\) 代表考虑到第 \(i\) 个值域段,选到了第 \(j\) 下标段的方案数,同时需要保证选择尽可能优,即选的是最长的情况。统计答案时只需额外记录一个 \(g\) 代表最长的情况有多长即可。本质上是对组合过程计数时的支配对。
考虑转移。枚举一下 \(i-1\) 这个值域段选到了 \(k\),一种情况是 \(i\) 这段不选,可以直接转移。若 \(i\) 这段选,需要满足“尽可能选满当前值域段”,由于每个值域段会由若干段上升和下降的段组成,因此讨论一下:
- \(k\sim j\) 不存在上升段。此时值域段只能选一个数,方案数显然。
- \(k\sim j\) 存在上升段。容易发现此时必然可以选满整个值域段,尝试计算方案数。考虑此时上升段的形态是非常有力的:它撑满了整个值域段。于是枚举一下在几个下降段里面选数,然后就是一个插板了。
直接做是 \(O(n^4)\),可以通过。设有 \(x\) 个上升段和 \(y\) 个下降段,那么 \(xy\) 之差不超过 \(1\),因此对于每个值域段可以提前预处理出转移系数。时间复杂度 \(O(n^3+n^2\log P)\),算转移系数时需要用聪明的方法求组合数,当然要是分块打表的话可以做到 \(O(n^3)\)。
显然这个做法看上去细节就很多,不是很好写(例如 \(j=k\) 时的转移,以及段的划分是否包含端点)。注意到 \(O(n^4\log V)\) 可以通过,因此没什么道理不写这个做法。
P5073 世上最幸福的女孩
复习一下凸优化那套东西。线段树上需要维护区间和、区间最大前缀和、区间最大后缀和、区间最大子段和。区间和非常容易。
考虑区间最大前缀和,后缀和同理。考虑每个位置的原来前缀和 \(s_i\),那么新前缀和是 \(ix+s_i\),需要求出这个的最大值,形式和斜率优化一模一样。构造斜率为 \(-x\) 的直线,注意到这条直线过 \((i,s_i)\) 时的截距就是新前缀和,维护上凸包后二分即可。
考虑区间最大子段和,直接套用上面的做法需要有所有长度为 \(len\) 的区间的最大子段和,不好做。考虑这个信息能否合并出来,注意到为左区间凸包、右区间凸包、左区间后缀和凸包与右区间前缀和凸包的闵可夫斯基和的 \(\max\)。全局修改,修改时不需要改变任何凸包的形态(询问时没必要合并单独为了修改所维护的信息),所以时间复杂度 \(2\log\)。
能否进一步利用全局加的性质?注意到将所有询问离线下来,按照询问时全局所加的值进行排序,从小到大处理询问后无需二分,直接维护指针即可,时间复杂度 \(1\log\)。
UVA1389 Hard Life
最大权导出子图连边方式:
- 对于每个点 \(i\),连边 \((S,i,w_i)\)。
- 对于每条边 \(i\),建立虚点 \(i'\),连边 \((i',u_i,\infty)\) 和 \((i',v_i,\infty)\)。
这个题分数规划后跑最大权导出子图即可。一种优化点数的方法是,考虑边数实际上是选的点度数之和减去一端选一端不选的边,于是依此建立选 \(u\) 不选 \(v\) 和选 \(v\) 不选 \(u\) 的关系即可。
上下界网络流
无源汇可行流:先让每条边流满下界,记此时流为 \(b\)。计算每个点应再往外流出 \(w_i\) 的流量。将原图的容量减去 \(b\),同时新增源汇点 \(S\) 和 \(T\),对于 \(i\),若 \(w_i\geq0\),连边 \((S,i,w_i)\),否则连边 \((i,T,-w_i)\)。合法当且仅当新图最大流为 \(\sum_{w_i>0}w_i\)。构造即为两次流相加。
有源汇可行流:不能直接用上面的方法是因为源汇点可能爆了,于是连边 \((T,S,\infty)\) 即可。
有源汇最大流:qwqq.
QOJ7512 Almost Prefix Concatenation
魔怔题。
第一想法是考虑 \(n^2\) 的组合意义,往这上面想就错完了。我不知道题解是如何得出这个做法的。考虑 \(n^2=2\binom n2+\binom n1\),记 \(f_{i,j}\) 代表考虑 \(S_{1\sim i}\),划分成了 \(n\) 段,\(\binom{n}{j}\) 的和是多少。转移枚举一下最后一个合法的段,根据 \(\binom nj=\binom{n-1}j+\binom{n-1}{j-1}\) 进行转移。状态数显然是 \(O(n)\) 的,只有 \(j\leq2\) 有用。
考虑加速转移,注意到一些单调性。记 \(g_i\) 代表最大的 \(j\) 使得 \(S_{i\sim j}\) 是 \(T\) 的“近似前缀”,求出这个以后可以方便转移。贪心,找一段 LCP 后跳过一个点,在找一段 LCP。二分哈希简单做到 \(1\log\),也可以 SA。
QOJ7513 Palindromic Beads
魔怔题。
只考虑回文串长度为奇数的情况,为偶数的情况是类似的(?)观察到固定回文中心后枚举可能的回文位置是均摊 \(O(n)\) 的。唯一难点在于统计贡献,实际上要做下面的事情:
给出若干条树上路径,定义 \(P<Q\) 当且仅当 \(P\in Q\),求最长上升子序列。
依长度枚举每条路径,考虑更加有力地刻画转移条件。对于 \((u,v)\),关注 \((dfn_u,dfn_v)\) 组成的平面,那么可以化为单点修改矩形 \(\max\) 的问题,树套树 \(2\log\) 即可。神人化为矩形 checkmax 矩形 \(\max\) 也是没救了。
树套树咋做矩形加矩形查询来着?显然有 push_up
就爆了,于是修改的时候对于每个访问到的节点都修一遍。
QOJ7523 Partially Free Meal
魔怔题。
按照 \(b\) 排序。然后可以简单 \(O(n^2)\) 做。看上去后面很难操作了,考虑每个决策的必要性。记 \(w(k,x)\) 为选择 \(k\) 个盘子,最后一个在 \(x\) 处的答案,朴素做法需要对 \(O(n^2)\) 个 \(w\) 全部算一遍,很不牛。
注意到对于 \(x<y\),若 \(w(k,x)\geq w(k,y)\),则 \(w(k',x)\geq w(k',y),k\leq k'\leq n\)。这说明什么?设求 \(i\) 处答案时决策点在 \(f_i\),即取到 \(w(i,f_i)\),由于 \(f_1\) 在 \(1\) 处优于所有 \(1\leq j<f_1\),依上引理得到 \(f_1\) 在 \(i\) 处优于所有 \(1\leq j<f_1\),这告诉我们 \(f_i\) 单调不降。
考虑如何计算单个 \(w\),无非是主席树,时间复杂度 \(2\log\)。
ZR3300 舔狗的上位
显然的暴力是按照值域从大往小加数,每次需要 check 用尽量少的长度为 \(d\) 的区间覆盖加入的数,稍微拼一下有 \(60\) 分,但是没有任何前途。
类似 CF1474F,从上往下做困难,考虑从左往右做。因为序列上的限制看上去就比值域上严格,我到底什么时候才能学会这个技巧???令 \(f_{i,j}\) 代表加入的数 \(\geq j\),考虑到 \(i\) 处,上一个起点。注意到转移可以维护 \(d\) 棵线段树进行线段树合并、分裂。时间复杂度 \(O(Tn\log n)\)。
P5840 Divljak
没什么思维含量。
多串匹配,对 \(S\) 建立 ACAM。每次加入 \(P\) 时将其在 ACAM 上经过的节点记录下来,放在 fail 树上考虑,那么就是所有子树内有至少一个被记录节点的终止节点贡献 \(+1\),这个建立虚树后可以用 \(O(len)\) 次单点加子树查刻画,当然也可以不用虚树直接刻画。那么就是 \(O(V)\) 次单点加,\(O(q)\) 次区间查,可以根号平衡,不过最后复杂度还是单 \(\log\)。
QOJ12565 矩阵
不算难,个人比较喜欢这道构造。考虑先来一个没有脑子的填法,从上到下从左到右依次填,这样左右相邻的数一定合法,上下相邻两个数如果不合法,那么其爆掉的约数一定是 \(n\) 的因数。注意到当 \(n\) 是质数的时候只有每行最后一个位置会爆,于是找到第一个 \(>n\) 的质数 \(p\),填出一个 \(p\times p\) 的矩阵取左上角即可。
QOJ12564 No explanation
看上去很不可做,因为字符串可以插入到任何地方。这如果是计数的话确实很不可做,但这是最优化。考虑最后的字符串,一定形如有若干个字符串有用,若干个没用,有用的会匹配上一段。钦定有用的字符串带来的匹配前缀,即最后一定有 luolikong
的若干个前缀匹配上,枚举匹配上的前缀集合 \(S\)。同时处理 \(nxt_{i,j}\) 代表第 \(i\) 个字符串从 \(j\) 开始匹配能匹配到哪。转移时若这个字符串可以没有用(存在 \(j\in S\) 使得 \(nxt_{i,j}=j\),即一个自环),则可以直接加入最终字符串。否则考虑其起作用的段,状压记录 \(f_i\) 代表哪些段已经加入,转移时考虑新加入哪个段即可。时间复杂度 \(O(k3^kn+k\sum|s_i|)\)。本质类似一个 ddp?
貌似计数也并非不可做,类似上面的做法直接做就好。。
CF2134F Permutation Oddness
首先画出运算表,然后发现怎么 dp 都需要记四种数的数量。考虑对于相同的组合结构统一计算,具体地,将 \(02\) 捆绑,将 \(13\) 捆绑,不同类相邻一定会产生 \(1\) 的贡献,考虑类内部。只有两种数的组合结构算起来很方便。令 \(c_{i,j}\) 代表考虑 \(02\) 这一类,划分为 \(i\) 段,段内部的贡献为 \(j\) 的方案数,\(b_{i,j}\) 同理。计算出两者之后枚举不同类的数量,这是 \(O(n)\) 的,方案数可以 \(O(n^3)\) 计算。计算 \(c_{i,j}\) 同理,时间复杂度 \(O(n^3)\)。
ZR3258 小黄瓜
太难了!!!
这个 \(ab+1\) 看上去不转化组合意义根本没法做。一个非常神秘的组合意义是,点权可以相乘或者变成 \(1\)。每次选择一条边,该条边连接了两个连通块,如果点权选择相乘就不合并连通块,否则合并连通块。最后大小为 \(1\) 的连通块贡献是 \(v_x\),\(>1\) 的连通块贡献为 \(1\),答案就是每个连通块贡献乘积。
考虑钦定了若干连通块,那么对于连接不同连通块的边,其被选择的时间一定要晚于连通块内的边。这样以后还是无法保证连通块是极大的,继续钦定连通块内的一条边,这条边是连通块内最后选中的边,显然这条边必须合并。此时连通块内其它边合并还是不合并就无所谓了。依照限制连边以后计算合法拓扑序即可。时间复杂度仍然不是多项式的。后面完全看不懂了,我们 jsy 写题解是这样的。
CF2138D Antiamuny and Slider Movement
要不是前面花了四十分钟手写 bitset,感觉这题还真可能过。下面的东西都是场上推出来的,只不过不可能写完了。
考虑固定操作序列,如何求出 \(i\) 的最终位置?此时每个操作对 \(i\) 形如 \(pos\leq x\) 或者 \(pos\geq x\) 的限制,记录上下界,若在某个时刻上界或下界爆掉了,那么答案就是爆掉的位置。当然还有一些 \(pos=x\) 的限制,先不去管。
枚举 \(i\) 以及最后的位置 \(j\),对序列倒着计数。称 \(pos\geq x\) 为一类限制,用 \(k1_a\) 代表 \(a\) 位置上有几个一类限制,\(sk1\) 代表一类限制的前缀和,\(hk1\) 代表一类限制的后缀和,二类限制同理。记 \(sl\) 为 \(pos=x\) 限制的数量。不妨设下界爆掉了,第一次取到这个下界的时候是 \(p_1\),爆掉的时候是 \(p_2\)(\(p_1<p_2\)),可以直接写出方案数:
这个式子的唯一难点在于计算两个排列数,不妨设 \(f(a,b)\) 代表 \(\sum\limits_{p1,p2}A\binom{q-p_2}aA\binom{p_2-p_1}b\),如果能预处理这个东西就可以 \(O(1)\) 计算上面的式子。好像组合意义不太好找,先做一些外部的工作:
后面的 \(\sum\) 是排列数上指标求和,找一下组合意义得到 \(\frac{A\binom{p_2}{b+1}}{b+1}\),具体就是从 \(p_2\) 个位置中放上 \(b\) 个有标号的球,枚举第 \(b\) 个球放在 \(i+1\)。此时式子为:
\(\frac{1}{b+1}\) 可以扔到外面,对分子找组合意义。类似地,有 \(q+1\) 个位置需要放上 \(a+b+2\) 个有标号的球,枚举一下第 \(b+2\) 个放在 \(p_2+1\) 处,得到 \(\frac{A\binom{q+1}{a+b+2}}{(a+b+2)\binom{a+b+1}{b+1}}\),注意前面不带 \(A\) 的是组合数。所以最终:
\(O(n^2)\) 处理出这个东西后开始分类讨论,上面已经说过了第二类限制使得第一类爆掉的情况,方案数为:
不妨将 \(pos=x\) 称为第三类限制,统计第三类限制使得第一类爆掉的情况,\(k3\)、\(sk3\)、\(hk3\) 的定义同上:
第一类限制使得第二类爆掉的方案数:
第三类限制使得第二类爆掉的方案数:
考虑第三类爆掉是什么意思,设当前上下界为 \((l,r)\),若出现 \(pos=x\) 的限制,且 \(l<x<r\),那么这就爆了:
里面有个枚举 \(p_1\),不过很容易消去,直接考虑组合意义得到 \(\frac{A\binom{q}{sk2_j+hk1_j+sl-1}}{sk2_j+hk1_j+sl-1}\)。
当 \(sl=0\) 时,注意还有初始位置的限制。直接考虑两类限制中最严的,如果没爆掉就让其爆掉。注意到并不能枚举 \(j\),不过显然最终的位置只可能有 \(O(q)\) 个,枚举这些位置即可。
时间复杂度 \(O(nq)\),帅!
CF2140E2 Prime Gaming
设一个局面的权值为 \(v\),注意到这个局面对答案的贡献为 \(\sum\limits_{i=1}^m [v\leq i]\)。
还有,为什么做这个题的时候花了一年去思考判定,完全不是人。
CF1895G Two Characters, Two Colors
首先注意到一个集合划分模型,将最大化收益转化为最小化代价,通常的连边需要对于每个逆序对建立虚点。但这个结构过于复杂,不利于后面的模拟最大流,考虑对于 \(1\),划分到 \(S\) 所在的集合中视为保留,对于 \(0\),划分到 \(T\) 所在的集合中视为保留。
需要求最大流。流量下界为 \(\sum\min(r_i,b_i)\)。考虑对于一个 \(r_i<b_i\) 的 \(1\),由于其没有其它入边,因此无法在这个点上经过更多的流量。实际上,对于一个 \(1\),只有当 \(r_i>b_i\) 时,其可以向后面任何一个 \(0\) 贡献 \(r_i-b_i\) 的流量;对于一个 \(0\),当 \(r_i>b_i\) 时,其可以接受前面 \(1\) 的 \(r_i-b_i\) 流量。需要支持:
- 加入元素。
- 将前 \(k_i\) 大 \(-1\)。
- 删除为 \(0\) 的元素。
注意到可以平衡树维护。时间复杂度 \(O(n\log n)\)。
UOJ984 欢迎来到最前线
写一下凸性证明。
最小费用 \(k\) 次匹配,考虑建图跑最小费用最大流,每次增广会使流量恰好 \(+1\),而 SSP 的过程中每轮增广过后费用在同流量的流中都是最小的,因此每轮增广记录当前费用,就能求出流量恰好为 \(k\) 时的最小费用。我们已知费用关于流量是凸的,所以这个题答案关于匹配数是凸的。
后面的模拟费用流意义不明。
P12865 冒泡排序机
对于前缀最大值和非前缀最大值分开维护,每次操作都将序列平移一位,这样前缀最大值的变化就是移动到下一个前缀最大值所在的位置。最后一个前缀最大值位置特殊处理一下就好。非前缀最大值位置不会发生变化。还需要记录每个位置从非前缀最大值变成前缀最大值的时间,这是简单的。
CF1810G The Maximum Prefix
往后加数只会改变一个前缀和,此时维护最大前缀和不好做。考虑能否让前缀和整体变化。倒着加数,令 \(f_{i,j}\) 代表考虑 \([i,k]\),此时最大前缀和为 \(j\) 的概率,转移到 \(f_{i-1,j+1}\) 和 \(f_{i-1,\max(0,j-1)}\)。
这样做的时间复杂度是 \(O(n^3)\) 的,注意到对于每个 \(k\) 我们的转移过程其实都一样。本质上是对于一张 DAG,求某个点走到 \(T\) 的所有路径中,权值之和。那么考虑在 DAG 上 dp 贡献系数,具体地,令 \(g_{i,j}\) 代表 \((i,j)\) 这个状态走到 \(T\) 的所有路径权值之和,那么可以直接转移。时间复杂度 \(O(n^2)\)。
炼石计划 day5t2
首先 kmp 后转化为如下问题:
加叶子,查询一个点的子树大小
Southern_Dynasty 发表了单 \(\log\) 做法,我之前从来没见过这个东西,这就是我和队爷的差距!
考虑平衡树维护括号序,dfs 进入一个点时加 (
,离开加 )
。那么加点只需要在父亲的 (
后加 ()
。
P11621 TEST_139
平面等腰直角三角形加,查询矩形和。
经典问题。考虑矩形加矩形和是咋做的,通过一堆拆拆拆把 4-side 变成 2-side,然后扫描线扫掉一维,数据结构维护另一维。那等腰直角三角形肯定也要拆拆拆。认为下面查的都是 2-side 矩形。等腰直角三角形的拆拆拆是拆成一种 2-side 的等腰直角三角形,考虑这种三角形怎么贡献到询问上。不妨用一个半平面交 \((x=0),(y=b),(y=-x+a+b)\) 来刻画这个三角形,顶点为 \((a,b)\)。注意到一般拆询问矩形的方法还不太好用,因为交不是一个很好的图形,将询问矩形拆成 \(\{(x,y)|x\geq X,y\geq Y\}\) 的 2-side 矩形。此时交一定是一个等腰直角三角形!分情况讨论,将牛牛的多项式乘法拆开维护二次项和一次项即可,限制来源于空间维和时间维,一共三维,cdq 维护。
注意到还有一种情况是三角形长成 \((x=0),(y=b),(y=x-a+b)\),那此时询问矩形就需要拆成 \(\{(x,y)|x\leq X,y\geq Y\}\),剩下类似。总之多做几遍 cdq 总能解决问题的。
感觉我一直学的是假的 cdq,很少听人把分治解释成降维的手段,但这才是分治的本质。
可以发现查询平面等腰直角三角形和也是可以做的,无非是多了几种情况。
QOJ14308 Walk
贡献很不好描述,来一点比较牛的刻画。注意到合法路径将平面分成了左上和右下两个连通块。那么贡献就可以用左下角和右上角是否在同一个连通块内进行描述。先用最小割来刻画合法路径。
每行每列新建虚点,\(S\) 向左上的虚点连边,右下的虚点向 \(T\) 连边。每个点向右下连边,那么注意到一个正常的割就对应了一条合法路径(正常的割指不割掉 \(\infty\) 边且点集连通)。此时贡献用集合划分模型可以简单刻画。注意到我们首先需要保证割对应了合法路径,因此提高每个点向右下连边的权值 \(W\),保证不会因为新加的限制影响割的合法性。
QOJ6441 Ancient Magic Circle in Teyvat
四个点的导出子图计数只有 \(K_4\) 和 \(4K_1\) 没法在 \(O(m\sqrt m)\) 做,其它都可以,至于怎么做并不是这里的重点。考虑对 \(K_4\) 计数,容斥一下,发现带了一个 \(K_1\),容斥系数恰好是 \(1\),那么直接减去即可。对其它十种子图计数。
来一点不一样的做法。先和上面类似,对于一个四个点的导出子图,钦定一些边必须存在,然后计数,我们想容斥出 \(K_4-4K_1\) 的结果。令一个行向量为 \(y\),\(y_i\) 记录第 \(i\) 种图的数量(钦定了一些边必须存在,包含 \(K_4\)),左乘上一个列向量 \(x\),满足 \(x\) 对应
ZR3279 图
首先这个 \(w\neq0\) 的情况显然是硬套上去的,为了区分有线性代数水平和没线性代数水平的选手。这里只写 \(w=0\) 的情况。
Gellyfish 曾经大讲特讲一个非 poly 做法。令 \(f_S\) 为 \(S\) 连通的方案数,\(x=lowbit(S)\),钦定一下 \(x\) 所在的连通块 \(T\),减去 \(T\) 独立于其它连通块的方案数。仿照这个做法,首先每个连通块内部的连边可以直接算,对于连通块外的,搜出拆分数,令 \(f_{S,i}\) 代表连通块状况为 \(S\),有 \(i\) 条边的方案数。枚举 \(lowbit\) 所在的连通块后大概可以转移,这也是我场上的想法,后面要写一个 NTT 就倒闭了。
知名 NOI d 类银牌女队 baka24 提出了一个非常有建设性的做法。只考虑 \(m_0\) 的情况,我们去凑容斥系数。
上面两个题先不管,因为我突然不会了。
QOJ14325 Xor Mirror
高低位分块,之前好像见过一次。考虑在二进制下将下标分成高 \(B\) 位和低 \(B\) 位。一个块维护的是 \([xB,(x+1)B-1]\),考虑操作,先来只考虑对整块的修改。此时 \([xB,(x+1)B-1]\) 这个块的高 \(B\) 位和低 \(B\) 位会发生相应的变化,不过能保证整块操作完还是另一个整块。对于每个块记录当前这个块对应的是原序列哪个块,查询的时候只需查询对应块的和。
散块考虑暴力重构。总共需要两个标记,第一个标记维护当前块对应原序列哪个块,第二个标记记录当前块内部的结构。时间复杂度 \(O(q2^B)\)。
QOJ14324 The Only Heart
这题我有什么做出来的可能吗。
自然的想法是求出连通块数减去有两个重心的连通块数。枚举断掉哪条边后需要求出两边的背包信息,不太可能可做。考虑一个非常牛的组合意义,断掉的边子树内点权为 \(1\),子树外为 \(-1\),即求点权和为 \(0\) 的连通块数。此时很好的一个事情是我们
to do list: P4694、CF2140F、JSCPC2025L、23杭州C、ZR3258、炼石day1t4