202508做题记录
加粗斜体表示思考时被卡了的部分。
打 \(*\) 的表示做过的重新想(做)一遍。
打 \(^?\) 的表示看了题解。
打 ~ 的表示还没做 / 还没写上来。
特别的,\(^!\) 和 \(*^?\) 都表示做过一遍还是不会 😦
AT
AGC010 E $^?$
考虑两个不互质的数,被先手确定顺序后就无法改变了。
考虑拓扑序和这个性质是类似的,如果存在 \(u\to v\),则 \(u\) 的拓扑序一定先于 \(v\)。
于是问题变为,对于两个点 \((u,v)u\neq v\),若 \(\gcd(a_u,a_v)\neq 1\),则 \((u,v)\) 有边。
先手需要定向 \((u,v)\),使得后手获得最大的拓扑序最小。
考虑贪心,对于每个连通块都要去到最优。对于一个连通块,我们考虑:钦定最小的那个点为根,开始 dfs:
如果当前 dfs 到 \(u\),那么找到所有邻居 \(N\),按照从小到大的顺序访问 \(i\in N\):
- 如果 \(i\) 已访问,则跳过;
- 连边 \((u,i)\),递归进 \(i\)。
ARC 104
A,B 略过。
C
考虑一个区间 \([l,r]\) 里有 \(d=(r-l+1)/2\) 个人,每个人的上下电梯关系一定是 \((l,l+d)\)。
然后 \(w(l,r)\) 表示 \([l,r]\) 作为一个区间是否可能。这是好算的。
转移就是 \(f(i)w(i+1,j)\to f(j)\)。
复杂度 \(O(n^3)\)。存在平方做法。
D
考虑平均数要记录元素个数,不太好。
枚举平均数为 \(v\),那么每个数变成了 \(v+d\),问题变成选择一些 \(d\) 使得 \(\sum d_i=0\)。
考虑 \(f(i,j)\) 表示选择前 \(i\) 种 \(d\),\(\sum d_k=j\) 的方案数。
状态数是 \(O(n^3k)\) 的,转移使用前缀和优化是 \(O(1)\) 的。
注意到更换平均数的时候不需要重新计算,只要把 \(f(k-1),f(n-k)\) 拼起来就好了。
E
\(n\) 非常小,考虑一些暴力。
首先 \(n^n\) 枚举数的大小关系,然后可以用 \(O(n^3)\) 的 dp 算出方案数。
复杂度:跑不满的 \(O(n^{n+3})\)。
* F
简单题。考虑用笛卡尔树来刻画,那么每次就相当于找到这些点笛卡尔树的根。
于是设 \(f(l,r,v)\) 表示 \([l,r]\) 区间内,值不超过 \(v\) 的方案数。转移枚举最大值。
ARC 105
A,B,C 略过。
PS:我认为 DE 一个难度。。
D $^?$
考虑对 \(n\) 奇偶分类:
- \(n\) 为奇数,则后手想要让 \(SG\neq 0\),后手只要每次选择袋子中最多的那堆石子,放到先手第一轮放的那个盘子里,那么最后这个盘子石子的个数一定严格大于总石子的一半。因为异或不超过加法,所以另外的异或一定小于该值。故 \(SG\neq 0\)。故后手必胜。
- \(n\) 为偶数,则先手想要让 \(SG\neq 0\),最优方案仍然是每次选择最多的。但是如果每种大小的石头出现偶数次,则后手可以复制先手的操作,使得 \(SG=0\)。
故先手胜利当且仅当 \(n\in \text{even}\) 且存在一种大小的石头不出现偶数次。
E
注意到最后情况一定是,存在两个连通块 \(1\in S,n\in T\),同时 \(S,T\) 是完全图。
此时已经走了 \(\frac{n(n-1)}{2}-m-|S||T|\) 步。根据这个的奇偶性可以得到先后手谁胜利。
仍然是考虑奇偶分类。
-
\(n\) 为奇数,则 \(|S||T|\) 必为偶数,所以谁胜利只和 \(\frac{n(n-1)}{2}-m\) 有关。如果是奇数则先手,否则后手。
-
\(n\) 为偶数。考虑对 \(|S|,|T|\) 的奇偶分类讨论。这里假设 \(\frac{n(n-1)}{2}-m\) 是偶数。
-
\(|S|\in\text{even},|T|\in\text{even}\)
先手想要胜利,则要维持 \(|S|,|T|\) 的奇偶性不变。考虑先手可以把偶数并到 \(S,T\) 中,或者把两个奇数合并为偶数,后手如果把奇数并到 \(S,T\) 中,先手复制操作。故先手可以保持奇偶性不变,先手必胜。
-
\(|S|\in\text{even},|T|\in\text{odd}\)
考虑先手第一步可以转化为上一种情况,同时 \(\frac{n(n-1)}{2}-m'\) 变为奇数,故先手必胜。
-
\(|S|\in\text{odd},|T|\in\text{even}\) 同上,先手必胜。
-
\(|S|\in\text{odd},|T|\in\text{odd}\) 和第一种情况同理,后手必胜。
如果 \(\frac{n(n-1)}{2}-m\) 为奇数是同理的。
-
于是做完了。
* F
不考虑联通,设 \(g_S\) 表示点集 \(S\) 构成二分图的方案数。枚举 \(T\) 为左部点,则 \(S-T\) 为右部点,可以计算出方案。
考虑联通,\(f_S=g_S-\sum\limits_{T\subsetneq S,\min T=\min S} f_Tg_{S\setminus T}\)
答案即为 \(f_U\)。
ARC 204
A
考虑操作的某一情况会让结果变为一定值的,同时其他情况很好算,要求最后的结果,可以考虑枚举最后一次出现变为定值的位置,得到最后答案的一个式子。
然后已知式子再去 dp。而不是 dp 的过程中维护神秘东西。
令 \(suf_i=\sum_{j\geq i}a_j\),\(pre_i=\sum_{j\leq i}b_j\)。
则答案为 \(\max_{i=1}^n suf(i+1)+pre(d_i)\)。其中 \(d_i\) 表示在 \(a\) delete 到 \(a_i\) 之前,加入了 \(d_i\) 个 \(b\)。
然后要求这个式子不能超过 \(x\) 的方案数,可以简单 dp 算出。
然后就做完了。
B $^?$
棋差一着啊棋差一着。
考虑朴素区间 dp 是 \(O(n^3k^3)\) 的。
_然后考虑观察性质,发现最优转移一定满足 _
- \(f(l,r)=f(l,k)+f(k,r)\),其中 \(a_k\equiv a_l\pmod n\) 或 \(a_k\equiv a_r\pmod n\)。
- \(f(l,r)=f(l,r-1)+w(l,r)\)
- \(f(l,r)=f(l+1,r)+w(l,r)\)
注意到一共只有 \(k\) 个 \(\bmod n\) 同余的,所以一次转移 \(O(k)\)。
然后复杂度就是 \(O(n^2k^3)\)。
CF
CF 2127
E
考虑最优的填色情况,如果一个点还没有颜色,并且其子树中存在颜色,那么这个点的颜色一定是子树里已经有的颜色,否则一定不优。
然后考虑一个点什么时候会被算入代价,那一定是这个点同时在多种颜色的虚树上。同时我们注意到,把一个没有颜色的点填色,其颜色虚树是不变的,所以这个贪心是最优的。
F $^?$
首先考虑如何求出满足:
- \(\sum_{i=1}^n a_i=m\)
- \(a_i\in [0,x]\)
的 \(a\) 的方案数(设为 \(F(n,m,x)\))。
考虑二项式反演,\(g(i)\) 表示钦定 \(i\) 个位置 \(>x\) 的方案数,\(f(i)\) 表示恰好 \(i\) 个 \(>x\)。
有 \(g(i)=\binom{n}{i}\binom{m-(x+1)i+n-1}{n-1}\)。
同时 \(g(i)=\sum_{j\geq i}\binom{j}{i}f(j)\)。
则 \(f(i)=\sum_{j\geq i}\binom{j}{i}(-1)^{j-i}g(j)\)。
故我们可以在 \(O(\frac{m}{x})\) 的时间内算出 \(F(n,m,x)\)。
然后考虑原题。首先原题可以转化为,\(f(a)=-a_1+a_n+\sum_{i<n,a_i=a_n}(a_i-a_{i+1})\)。
然后分别计数。
首先是 \(a_n\),枚举 \(a_n\),然后方案数是 \(F(n-1,m-a_n,a_n)\)。
然后是 \(-a_1\),枚举 \(a_n\),然后方案数是 \(F(n-1,m-a_n,a_n)\)。
考虑每个方案的和是 \((m-a_n)F(n-1,m-a_n,a_n)\)。
同时每个位置期望相同,所以 \(-a_1\) 所有情况下的和是 \(-\frac{m-a_n}{n-1}F(n-1,m-a_n,a_n)\)。
最后是 \(\sum_{i<n,a_i=a_n}(a_i-a_{i+1})\),考虑拆贡献,对每个 \(i\) 计数。
因为 \(i\) 在哪里都是等价的,所以只要算出某个 \(i\),然后乘以 \(n-2\) 即可。
考虑枚举 \(a_n\),然后方案数 \(F(n-2,m-2a_n,a_n)\),同理 \(a_{i+1}\) 大小是 \(\frac{m-2a_n}{n-2}F(n-2,m-2a_n,a_n)\)。
加起来就好了。
MX-BJ-A
Day 6
gcd
首先贪心,选择 gcd 相同时最短的段。可以看做是从起点不断跳出边到达终点右侧的步数。
注意到一个点的出边 \(O(\log n)\) 条,倍增跳 相同的边,复杂度 \(O(n\log^2 n\log\log n)\)。
irris
画画图,发现一个点经过 \(k\) 次左儿子有兄弟变换后的父亲和 dfn 序有关,所以把树离线下来,维护当前被点亮的点在 dfn 上的位置,线段树上二分即可。
shiro / CF1322F $^?$
先用带权并查集维护边的关系。
先二分答案。考虑判定。
考虑已知 \(\lim\) 的情况下,当前树的根节点 \(x\) 的取值范围。
这里假设 \(x\) 的父亲边满足父亲比儿子大。如果方向不同,取值区间是沿着中轴对称的。
注意到我们只需要维护 \(x\) 的最小值。
考虑转移:
- 如果儿子边和父亲边属于同一个并查集,那么直接做转移。
- 否则把不同并查集的儿子边内部做 \(\text{and}\),然后转移是当前和对称的并。
然后考虑第二种情况可能会有两个区间。因为区间是对称的,所以只维护左侧,求完再对称到右侧,最后和第一种情况得到的那个区间求交即可。
然后考虑构造。
反着做,如果当前 \(x\) 的某个儿子 \(i\) 使用原来 dp 值得到的转移区间不包含 \(ans_x\),说明 \(i\) 的 dp 值要对称一下。然后递归做下去。
Day 7
* nine / AtCoder wtf19_b
先离散化,然后并查集维护连通块。
考虑枚举每一位填了集合 \(S\) 中的位置,那么贡献可以预处理出来为 \(w(S)\)。
把集合幂级数弄出来,是 \(F(x)=\sum_{S\subseteq U} w(S)x^S\)
然后可以子集卷积快速幂做到 \(O(2^nn^2\log)\)。
问题在于 \(w(S)\) 是多少。
考虑对于离散化后相邻的两个位置 \(l,r\) 之间的段,原来有 \(\dfrac{10^{r-l}-1}{9}\) 种选择,然后如果 \(v_l=v_r\),则有 \(\dfrac{10^{r-l}+8}{9}\) 种选择。
所以 \(w(S)\) 就是 \(\prod_{(l,r)\in T}\dfrac{10^{r-l}+8}{10^{r-l}-1}\)。
其中 \(T\) 是满足 \((l,r)\) 相邻且 \(l\in S\land r\in S\) 的集合。
Day 8
sakura / Gym 103428C $^?$
歪解:使用 bitset + 二进制分组 + 打乱后取前(常数)个 暴力。
正解:考虑直接求出每次操作会让多少个位置变成 1。
放松限制,考虑求出每次循环移位 \(x\) 并且取或前,满足 \(i\) 和 \(i+x\) 不同的 \(i\)。这和变成 \(1\) 的位置个数同阶。
注意到可以使用哈希二分之类的求出每个位置。然后做完了。
tsuki / QOJ 4299 $^?$
考虑如果一个点的度数是偶数 \(2d\),那么存在一条欧拉回路。沿着回路定向,可以让出度入度都为 \(d\)。
那么考虑度数是 \(2d+1\) 的,意味着存在一种定向方式使得一个点的出度和入度之差不超过 \(1\)。
然后我们 \(2^n\) 枚举出度多还是入度多,然后拆点跑网络流。复杂度 \(O(2^nn^3)\)。
kaze / AtCoder ddcc2020_final_d
难评。
考虑基环树的直径怎么求。分为过环直径和树内直径。
树内直径好求,过环直径稍微麻烦一点,但是也不难求。
然后是删点后求直径。设删除点 \(i\) 属于树 \(T\)。
考虑树内直径的变化,使用一个换根 dp 求解。这里同时记录删除某个点后 \(T\) 的深度。
然后考虑过环直径,记录不经过 \(T\) 内的最长路径,以及从 \(root(T)\) 开始到达 \(T\) 外的最远位置。
把这几种拼在一起就好了。细节多。
Day 9
回程。
P9544
感谢 @FFTotoro 给我分享了这个神人题。
考虑把连通块和凸包联系在一起是非常困难的。所以考虑要找个性质来转化某个限制,然后才能做下去。
这也是思考一类限制非常抽象,难以直接求解的题目的重要方法。
然后考虑凸包这玩意,我们发现如果凸包包含一个点,那么一定存在凸包的某三个点组成的三角形包含这个点。
所以我们只关心三个点之间的路径构成的连通块。
然后考虑特殊性质,我们发现菊花的答案一定不超过 \(3\)。
然后这就导出了一个性质:
一定存在一个替换策略使得,第四个点,可以替换前三个点中的某个点,使得组成的三角形仍然包含原点。
所以答案一定是一条路径。
然后点分治就做完了。
百度之星
2025 初赛 2
T1
观察,发现数对 \((x,y)(x<y)\) 无法被同时选中,当且仅当这两种情况中的一种被满足:
- \((x,y)\in E\),即 \(x,y\) 相邻。
- \(\text{dis}(x,y)=3,\deg(x)=\deg(y)=1\)。
对于其他情况,我们可以得出构造方法。
然后考虑减去这两种情况,第一种情况有 \(n-1\) 种。
第二种情况,我们枚举路径中间那条边,设 \(f(x)\) 表示 \(x\) 的邻居中 \(\deg=1\) 的个数,答案就是 \(\sum_{(x,y)\in E}f(x)f(y)\)。
于是答案就是 \(\binom{n}{2}-(n-1)-\sum_{(x,y)\in E}f(x)f(y)\)。
T2 $^?$
怎么没意识到异或哈希。。
考虑如何可以快速维护一个点周围的边的整体操作。
考虑定根,然后一个点维护其到所有儿子的边,维护两个集合表示边的方向。
那么一次操作最多改变两个集合 \(1\) 的大小。所以在单独翻转某一方向的边的时候,我们直接启发式暴力合并,复杂度是均摊线性的。
然后问题在于,如何高效判断当前的树是否满足以 \(k\) 为根。。
一个愚蠢的想法是,注意到此时除了根,都恰好只有一条出边,所以维护每个点的出边数量。然后发现这玩意根本不能维护。。
一个聪明的想法是,注意到,合法的边定向情况是唯一的。所以我们直接维护边定向,然后判定这个边定向是不是我们需要的。
判断两个集合相等。这啥啊,这不就是哈希吗。。
所以我们直接维护边方向的异或哈希。然后只要跟着维护边的集合的修改而修改就好了。。
这种合法情况唯一(或者很少)的,并且可以预处理的,直接上哈希就好了。。
T3
首先题目的意思是,有一个 \(n\) 位的 \(k\) 进制数,每一位可以填 \([0,k]\),带一个 \(a\in\{-1,1\}\) 的权,问最后和为 \(0\) 的方案数。
因为低位只会有 \(0\) 或 \(1\) 的进位,从低到高考虑,因为最后答案要是 \(0\),所以每一位最后的结果都是 \(0\)。
考虑 dp,设 \(f(d,x)\) 表示 dp 到第 \(d\) 位,进 \(x\) 位的方案数。
然后枚举当前进了 \(0/1\) 位即可。
T4
注意到 \(\gcd\) 只可能是 \(1\) 或 \(2\):
对于 \(n\bmod 2=1\),\(\gcd\) 只可能是 \(1\),所以答案就是 \(1,2,\cdots\)。
对于 \(n\bmod 2=0\),\(\gcd\) 只可能是 \(2\),所以答案是 \(2,1,4,3,\cdots\)。
* T6
考虑图 \(G\) 上,\(x,y\) 之间有边当且仅当 \(\exists k,x\oplus y=2^k\),此时 \(\text{popcnt}(x\oplus y)=dis(x,y)\)。正确性显然。
然后注意到最短路的势能是 \(k2^k\),消耗 \(1\) 势能最多需要 \(O(k)\) 的复杂度(枚举出边),所以复杂度 \(O(2^kk^2)\)。
存在 \(O(k2^k)\) 的做法(@TernaryTree)。
T7
题意是,对树做左儿子右兄弟变换可以做几次。
结论是,对于点 \(x\),其父亲的变化次数是 \(sz(L_x)\),其中 \(L_x\) 表示 \(x\) 左边的兄弟。可以通过手摸样例得出。
注意如果不存在 \(L_x\),则父亲永远不变。
然后问题变成维护 \(\max sz(L_x)\)。使用树剖做到两个 \(\log\)。
但是过不去。注意到如果一个 \(y\) 满足 \(\exists x,L_x=y\),则 \(y\) 子树内的 \(sz\) 都不需要计算了。我们称 \(y\) 为关键点。
接下来只考虑关键点。
所以加入一个点,只会影响一个关键点 \(sz\)。
然后注意到加入一个点,可能会影响一些关键点变为非关键点,均摊是 \(O(n)\) 的。
复杂度线性乘个并查集的复杂度。
T8
注意到全局 \(-1\) 唯一用处是把数减到 \(0\)。
所以分类讨论:
- 一种是选定一个 \(x\),用操作二把非 \(x\) 的数变成 \(x\)。
- 一种是选择一个 \(x\),把 \(\leq x\) 的减到 \(0\),把 \(>x\) 的赋值为 \(0\)。
答案为二者最小值。
HT
HT-072-NOI
* A
考虑枚举 \(a,b\)。
我们考虑 \(w\) 较小的数,不妨设做 \(x(x\in \{a,b\})\)。
考虑 \(y(w_y\geq w_x)\)。
- 考虑 \(y<x\):我们发现,只有左侧最大的满足 \(w_y>w_x\) 的 \(y\) 有可能最优。
- 考虑 \(y>x\):我们发现,只有右侧最小的满足 \(w_y>w_x\) 的 \(y\) 有可能最优。
所以一共只有 \(O(n)\) 对满足要求。然后随便做。
B $^?$
注意到如果直接记录状态,需要记录连续段之间的距离,是不可能做到的。
注意到,每一步最多会新增一个连续段,并且原来的连续段除了合并以外,只会有向两侧增加这一操作。
然后同时两侧增加需要处理的细节比较多,我们把步骤拆分成:左侧增加,右侧增加,加入一个点。
期望比较麻烦,因为我们如果记录步数会让状态比较多,所以我们在过程中记方案数,在最后一小步再除以 \(n\)。这样步数这个条件就在转移中被记录了。
所以考虑连续段 dp,我们只关心现在有几个段,哪些段现在会合并,所以设 \(f(i,j,t)\) 表示当前点亮 \(i\) 个点,现在有 \(j\) 个段,做到(拆分后的)第 \(t\in[0,2]\) 步了。
考虑转移。\(t\in[0,1]\) 的转移就是枚举有几段被合并。\(f(i,j,t)\binom{j}{k}\to f(i+1,k,t)\)。
然后是 \(t=2\) 的转移,可以:新增一个连续段,加入在某个连续段中,某个连续段左右邻居。
转移方案数好算的。
C $^?$
感性思考一下,我们发现,操作是把树分成一些连通块,连通块自己内部操作,然后再合并。
也就是有一堆有根森林,并且贡献满足:
- 根节点不相邻。
- 设根 \(x\) 的贡献是 \(t\in\{1,-1\}\),则其(森林中)邻居的贡献是 \(-t\),同时满足,以 \(x\) 为根的树中,一个点的贡献和其兄弟是相同的。
构造考虑:森林中我们只要从上到下操作,上面的位置可以自由确定。森林间,如果存在一条边连接根和非根,只要让非根节点先被操作即可。
然后考虑 dp。注意到我们只关心:到父亲的边,当前连通块的根在哪里。
分类讨论一下:
-
到父亲的边是森林间的边。
-
当前森林的根不是 \(x\)。设为 \(a(x)\)。
-
当前森林的根是 \(x\)。设为 \(b(x)\)。
-
-
到父亲的边是森林内的边。
-
当前森林的根不在 \(x\) 子树。设为 \(c(x)\)。
注意这个状态,可能 \(fa(x)\) 是根,这样 \(x\) 的贡献会被强制确定,所以 \(x\) 处不能确定 \(x\) 的贡献(或者要多记东西)。
-
当前森林的根在 \(x\) 子树。设为 \(d(x)\)。
注意这个状态,可能 \(x\) 是根,这样 \(fa(x)\) 的贡献必须要在 \(x\) 处确定,否则可能出错(或者要多记东西)。
-
考虑转移:
令:
- \(s(x)\) 为 \(x\) 的儿子集合。
- \(S(op)=\sum_{y\in s(x)}\max(c(y)\ op\ v_y,a_y,b_y)\)
- \(S2(op)=\sum_{y\in s(x)}\max(c(y)\ op\ v_y,a_y)\)
- \(M(op)=\max_{y\in s(x)}(d_y-\max(c(y)\ op\ v_y,a_y,b_y))\)
然后有:
都啥意思:
-
\(S\) 表示 \(x\) 不是根,不考虑根节点的最大值。
-
\(M\) 表示 \(S\) 的基础上,钦定某个儿子子树里有根的最大贡献。
-
\(S2\) 表示 \(x\) 是根,不考虑根节点的最大值。
-
\(a\) 的转移,注意 \(M\) 的贡献包含了 \(v_x\)。
-
\(b\) 的转移,枚举 \(x\) 为根,贡献是 \(-op\),那么儿子贡献是 \(S2(op)\)。
-
\(d_1\) 的转移,\(x\) 不是根,就是在 \(a(x)\) 的基础上算上父亲贡献。
-
\(d_2\) 的转移,\(x\) 是根,就是在 \(S\) 的基础上算上自己和父亲贡献。
HT-073-NOI
喜欢搬原题,后面忘了。
A / P9361
这种图的特殊性质就是,我们只关心第 \(k\) 步后,每一维可以到达的最大值。
注意到,全过程只有第一步和最后一步不会从最大值拓展,所以中间的步骤我们使用倍增就好了。
我们倍增记录第 \(i\) 个人走 \(k\) 步,每一维会到达 \(rk\) 多少,然后转移只从 rk 最大的 \(m\) 个进行转移。
复杂度 \(O((n+q)m^2\log n)\)
B / P5841 $^?$
一直在想 SA。然后从 SA 的假做法一路绕回真做法就没时间了。。
考虑本质上最优解就是找到 Trie 的一个 dfs 序。
所以先 \(x\) 后 \(y\) 的限制就是:
- \(\text{lca}\to x\) 的路径上,\(x\) 方向都是最后一个经过的。
- \(\text{lca}\to y\) 的路径上,\(y\) 方向都是第一个经过的。
- \(\text{lca}\) 处,一定是先 \(x\) 方向,然后立刻 \(y\) 方向。
然后用链表和并查集维护操作的合法性就做完了。
一个细节是,合并的时候,注意如果会同时把钦定第一个和钦定最后一个合并起来,注意检查是不是所有儿子都在了,否则后面就合并不进来了,即不合法。
然后注意到对路径上每个点这样做的复杂度是 \(O(qn)\) 的。
考虑一个性质是,把 Trie 的二度链缩起来,新 Trie 树的深度是 \(O(\sqrt{\sum |s_i|})\) 的。
于是复杂度变为 \(O(q\sqrt{\sum |s_i|})\)。
C / AT_wtf22_day1_d $^?$
中间卡了一步。
考虑化成线性规划的形式。
限制是 \(x_i=\min(1,\sum_{i\in [l_j,r_j]}y_j),\sum_j y_j\leq k\)。
求 \(\max \sum_i x_i\)。
其中 \(x_i\) 表示第 \(i\) 个人有没有联系上。\(y_i\) 表示第 \(i\) 天有无请客。
然后对偶一下,得到:
\(\forall i\in[1,n],\left(-\sum_{i\in[l_j,r_j]}y_j\right)+X\geq 0\)
\(\forall i\in[1,m],y_j\in [0,1]\)
\(\min \sum_i (1-y_i)+kX\)
枚举 \(k\),然后这个问题和线段覆盖等价。
设 \(f(i)\) 表示每个点最多被选中的 \([l_j,r_j]\) 覆盖 \(i\) 次,最多有多少线段。
则答案就是 \(ans_k=\min_i m-f(i)+ki\)。
然后考虑 \(f(i)\) 怎么求。首先 \(f(1)\) 是经典贪心,贪心右端点最小的。然后 \(f(i>1)\) 同样可以这样贪心。
对于新的 \(i\),第一次贪心取最左边的,然后用线段树维护不合法位置,对不合法右侧的子问题递归贪心。
然后 \(f\) 是凸的,\(ans_k\) 的决策是可以简单通过指针移动维护的。
集训
题单 #1
$^!$ A / ARC112 E
考虑每个数最后一次被操作才是有用的,被操作过的一定在两侧。
所以枚举 \(l,r\) 表示左侧 \(l\) 个右侧 \(r\) 个被操作过,中间合法的充要条件是数递增。
所以先分成 \(\begin{Bmatrix}m\\l+r\end{Bmatrix}\) 组。注意这些组可以通过左右数的顺序唯一确定是谁的。
然后在这里面选出 \(l\) 个在左边,即 \(\dbinom{l+r}{l}\)。
对于无用的 \(m-l-r\) 次操作自由选择,\(2^{m-l-r}\)。
答案把这些乘一下加起来就好了。
* B / ARC201 B
考虑从低位到高位贪心。低位要尽量选满,反正不影响高位。
然后把没被选的低位物品贪心地两个两个合并,相当于提高了一位。然后在高位继续贪心。
* C / CF2066 C
注意到 \(P\oplus Q\oplus R\) 在同一时刻,都是相同的。
因为那个唯一不同的一定是这三个数的异或和,所以我们只要记录相同的那两个数是多少。
然后发现大部分转移都是原地不动,只有一种特殊转移。然后做完了。
$^!$ D / ARC167 C
计数好难啊。计数好难啊。计数好难啊。
考虑 kruskal,那么我们只要计数权为 \(a_i\) 的边出现了 \(A_i\) 次,答案就是 \(\sum_i a_iA_i\)。
放宽限制有 \(B_i=\sum_{j\leq i}A_j\),对 \(B_i\) 计数。
即计数权不超过 \(i\) 的边的数量。这等于所有情况下,这样的边的数量和。我们不关心边具体是哪一条。只关心边最多可以连多少条。
所以考虑 \(a_j\leq i\) 的 \(j\) 集合 \(S_i\),一种最多连边的方法就是相邻两个 \(S_i\) 中的位置能连就连。
考虑一条边 \((l,r)\) 会被用上,当且仅当 \(a_l\leq i,a_r\leq i,r-l\leq K,\forall k\in(l,r),a_k>i\)。
考虑枚举 \(r-l=d\),然后上面问题的答案是 \(\binom{n-d}{i-1}(i-1)i!(n-i)!\)。
所以 \(B_i=\sum_{d=1}^{K}\binom{n-d}{i-1}(i-1)i!(n-i)!\)
答案即为 \(\sum_i i(B_i-B_{i-1})\)。
$^!$ E / AGC066 A
不会构造。
考虑一个想法是,黑白染色,枚举 \(d\),然后把黑色变成 \(d\),白色变成 \(k+d\)。
但是过不去,考虑只要求相邻差是 \(d\),所以其实只要 \(\bmod 2k=d\) 就好了。
然后就对了。证明考虑黑白互换,代价和 \(dn^2\)。
看到代价是 \(C/k\) 的构造题可以想一个方法,存在 \(k\) 种变式,但是代价和为 \(C\)。
$^!$ F / CF1062 F
考虑拓扑排序。
考虑一个点 \(x\) 可达所有拓扑序比他大的点,当且仅当存在一个时刻使得拓扑排序队列中只有 \(x\)。
考虑一个点 \(x\) 可达 所有拓扑序比他大的个数 -1 个点,当且仅当存在一个时刻使得拓扑排序队列中只有 \(x\) 和另一个点 \(y\)。并且 \(y\) 可达的点 \(x\) 都可达。 即 \(y\) 可达的点剩余 \(\deg>1\)。
G / Gym102803 E
考虑同时有 \(sa,height\) 的情况,这时我们可以确定两个后缀每个位置的大小关系。
考虑没有 \(height\) 的情况,首先有 \(sa_i,sa_{i+1}\) 位置的 \(\geq\) 关系,但是这时不够,我们还需要比较 \(sa_i+1\) 和 \(sa_{i+1}+1\) 的 \(rk\),如果 \(sa_i+1\) 的大,意味着 \(\geq\) 不可能取等。即 \(>\) 关系。
然后跑差分约束。
H / AGC044 C
01 trie 可以全局 +1,三进制 trie 当然也可以。然后打个 swap 1,2 的 tag 做完了。
I / CF2023 F $^?$
首先自己瞎推推可以推出,答案是:
假设起点在终点左侧,前后缀有一段经过两次的,并且这个前缀要求和非负。中间那段,如果一个位置 \(p\) 前缀和非负,\((p,p+1)\) 经过一次,为负,\((p,p+1)\) 经过三次。
然后。。换个角度,可以看做一开始每条边要经过两次,一个位置的权是 \([a_p\geq 0]-[a_p<0]\),求(对左端点有要求的)最大子段和。 然后直接线段树做完了。
这道题没写出来的问题在于,一开始没有区分经过点三次和经过边三次之类的问题。还是要考虑清楚。。
* J / ARC149 D
平衡树值域有交并瞎做,或者注意到,每次可以把短的折到长的一段上,然后值域小,均摊正确。
K / QOJ 7771 $^?$
首先考虑单次询问如何 \(O(n)\) 求出。首先假设 \(a\) 没有相同的数。
通过观察,我们可以发现,\(a_i\) 在归位之前,会移动到 \([l,r]\) 中最右侧的 \(\geq a_i\) 的位置。
也就是说,\(a_i\) 轮空当且仅当最右侧 \(\geq a_i\) 的位置是 \(l+rk_i-1\)。这个条件不好搞。
考虑转化一下。需要注意到的是,一轮操作不会让一个数跨过比他大的数。
所以 \(a_i\) 轮空当且仅当最右侧 \(\geq a_i\) 的位置左侧,没有 \(<a_i\) 的数。
考虑 \(a\) 中有相同的数。观察最后的位置,我们发现,每次会把值相同的位置集合里最小的拿去移动。这很不好维护。
但是我们不关心究竟哪次操作轮空,只关心轮空次数。 所以我们不妨假设,每次移动都是整体 R shift 一个合法位置。
所以最后的结论是:设 \(a_i\) 是值相同的元素中从左到右第 \(x\) 个,\(a_i\) 轮空当且仅当从右到左第 \(x\) 个 \(\geq a_i\) 的位置左侧,没有 \(<a_i\) 的数。
这样还是不太好做。继续转化。我们对不轮空计数。
注意到不轮空对于左端点 \(l\) 的限制仅仅是,\([l,i]\) 中不存在 \(<a_i\) 的数。设左侧第一个 \(<a_i\) 的位置是 \(pl-1\)。故 \(l\in [pl,i]\)。
对于右端点的限制稍显复杂:
考虑 \(i\) 右侧第一个 \(a_j<a_i\) 的 \(j\),设 \([i,j)\) 中有 \(x\) 个 \(=a_i\),\(y\) 个 \(>a_i\),\([j,r]\) 中有 \(z\) 个 \(>a_i\)。也就是不能把 \(x\) 个 \(=a_i\) 的都填进 \(z\) 个 \(>a_i\) 的位置。
所以要求是 \(x>z\)。也就是 \(x+y>z+y\)。注意到 \(x+y\) 表示 \(i\) 右侧 \(\geq a_i\) 的连续段个数,\(y+z\) 表示 \([i,r]\) 中 \(>a_i\) 的个数。
所以只要单调栈先求出 \(x+y\),然后树状数组二分出最右侧满足 \(z+y<x+y\) 的位置 \(pr\),就可以得出右端点的区间 \([i,pr]\) 了。
也就是 \(i\) 对于 \(l\in [pl,i],r\in [i,pr]\) 的询问,不会轮空。
这就是二维数点。做完了。
L / ARC176 F $^?$
好难啊。
不考虑 \(n\leq 2\) 或 \(m=1\)。
考虑正难则反。 反过来的操作是,对于一条边的两端点相同,则可以任意修改一个端点为任意颜色。要求最后还原成一开始的树。
我们考虑什么时候无法还原。
首先重要的就是两端点相同的边。我们把它叫做关键边。
答案是所有情况减去不合法。
我们对关键边的条数讨论:
介绍一下关键边的移动:
什么是移动:把关键边 \((u,v)\) 的某端点 \(u\) 的 \(a_u\) 设置成 \(u\) 另一出边 \((u,w)\) 的 \(a_w\)。此时关键边变为 \((u,w)\)。
我们把移动看做是,对于相邻两个颜色相同的点,删去一个点为空点(不妨设为 dep 小的),可以自由移动空点。空点可以任意填色。
-
\(0\):意味着这棵树没法动。因为对于 \(m>1\) 的树,最后一定有关键边,所以所有情况均不合法。方案 \(n(n-1)^{nm}\)。
-
\(1\):为了方便统计,我们把空点移动到最上面。
此时根的所有儿子互不相同。我们发现,无论如何操作,关键边最多只有一条。同理,所有情况均不合法。方案:\(n!nm(n-1)^{n(m-1)}\)。方案数解释为:根的儿子(移动后)颜色为 \(n\) 的排列,选择一条关键边有 \(nm\) 种方法,固定儿子和选择一个空点,还剩 \(n(m-1)\) 个点。注意移动前的根一定是移动后根的儿子,所以不会在 \((n-1)^{n(m-1)}\) 中计算。
-
\(2\):把关键边移动到最上面。
此时注意到有两个儿子相同。这里不合法的情况,当且仅当:第一层(根的儿子)有 \(n-1\) 种颜色,且第二层颜色均为唯一的第一层未出现的颜色。
- 一开始就有两个空点:方案 \(n!\binom{nm}{2}(n-1)^{n(m-2)}\)。
- 一开始只有一个,但是移动到根之后,出现两个相同的儿子。这里注意选择儿子有 \(\binom{n-1}{2}\) 种方案,因为空点所属子树对应的儿子无法作为相同的儿子之一。方案 \(n!nm\binom{n-1}{2}(n-1)^{n(m-2)}\)。
然后所有方案是 \(n^{nm+1}\)。减一下就做完了。
正确性的构造证明:待补。
M / ARC152 F $^?$
好厉害的题。
考虑答案下界是 \(dis(1,n)+1\),考虑尽可能构造出来。
首先判断无解。显然当 \(dis(1,n)\not\equiv n\pmod 2\) 时无解。
首先一个重要的观察:
首先需要让 \(1\) 走到 \(n\),所以我们先选择 \(dis(1,n)\) 个预定点表示拉着棋子沿着链前进的就是这些点。则子树 \(i\) 内最多有 \(dis(1,i)\) 个预定点。
如果 \(path(1,n)\) 上的点的子树大小不存在一个 \(i\) 使得 \(sz_i-dis(1,i)>\frac{n-dis(1,n)}{2}\),答案可以取到下界。
证明 考虑对不同子树的非预定点进行匹配,如果不存在这样的 \(i\) 则一定可以匹配。匹配后,只要当棋子走到匹配中间的某个位置后,匹配的两个点分别操作一下就行了。
否则匹配必须要有同子树内的匹配。
这时我们必须要让棋子进入子树。考虑进入子树的路径一定是一条链。
然后考虑,如何判断进入子树后,是否存在一组合法操作。
注意到我们进入子树,最后还是要出来的,所以不存在预定点。
然后考虑一定存在一种方案使得棋子可以到链底,所以只要存在合法匹配,则存在合法操作。
考虑进入子树,意味着子树父亲把这个子树“抛弃”了,所以把 sz 要减掉。
于是我们维护是否存在 \(sz_i-dis(1,id_i)>\frac{n-dis(1,n)}{2}\),然后不断拓展子树。
考虑拓展子树,显然是贪心拓展最大的子树的重儿子。
然后拓展的个数加上 \(1+dis(1,n)\) 就是答案。
N / ARC109 F $^?$
思路对了,细节错了。。
正难则反,考虑什么情况下可以删除某个位置,以及判定一个状态是否可以被删干净。
注意到删除连续段中间的不优,所以只会删除两侧的。如果当前连续段大小 \(\geq 2\),则随便删,否则:
设当前连续段是单独的一个 \(c\),对于其他连续段 \([l,r]\),必须有 \(a_{l-1}=a_{r+1}=c'\),其中 \(c'\) 和 \(c\) 表示不同的颜色。
我们称一个连续段最后删成只剩单个 \(c\),然后彻底删除,叫做这个连续段的 \(c-\) 删除。
考虑若已知第一个连续段是 \(c-\) 删除的,接下来的连续段最多只有一个是 \(c'-\) 删除的。
如果存在两个连续段是 \(c'-\) 删除的,那么在删除第一个的时候,要求另一个连续段两侧是 \(c\),显然不可能。否则两个连续段中必然有 \(c\),那么就可以转化为 \(c-\) 删除的。
所以最多一个连续段是 \(c'-\) 删除的,进一步分析,我们得出下列结论:
一个情况合法,当且仅当:
- 第一个被删除的段有 \(c\) 子序列。
- 最后一个被删除的有 \((c')(c')\) 子序列,且非空。
- 剩下的连续段必须有 \((c')c(c')\) 子序列。其中 \((c')\) 表示 \(c'\) 可以在连续段的左右邻居处。
然后分类讨论大力 dp 即可。
O / ARC179 F $^?$
好难啊。不会构造,烂完了。
考虑怎么快速判定一个得分位置序列(即什么时候得分)是否合法。
考虑必要条件。设 \(A,B\) 分别表示 \(S_i=\texttt{A},S_i=\texttt{B}\) 的出现次数。
考虑上一个得分位置 \(l-1\) 和下一个得分位置 \(r\),则 \([l,r]\) 区间内,\(A,B\) 需要满足:
\(B\equiv 0\pmod 2\) 和 \(2A-B\equiv 0\pmod 3\)。这两个都是显然的。
注意到上一次得分意味着“地面”和一开始一样,所以和第一次得分的必要条件分析相同。
然后得出 \(2A-B\equiv 0\pmod 6\)。注意 \(B\) 操作不能太多,否则 \(A\) 填不满缝,所以 \(2A-B\geq 0\)。
于是令 \(v_i=2\sum_{j\leq i}[S_j=\texttt{A}]-\sum_{j\leq i}[S_j=\texttt{B}]\),则上界是 \(v\) 的最长 \(\bmod 6\) 同余上升子序列。
然后考虑怎么构造。
首先一个不会违反规则的填法(不保证得分)是,对于 \(A\),填在左边一列,对于 \(B\),填右边两列。
但是这会导致最后左边一列和右边两列的高度差 \(d>0\)。
考虑调整法。设 \(f(i)\) 表示第 \(i\) 次的时候,左边一列比右边两列高出 \(f(i)\) 格。
考虑若 \(f(r)>0\),则 \(f(r)=6k(k>0)\)。
因为 \(f(l-1)=0,f(r)=6k>0\),并且 \(|f(i)-f(i-1)|\leq 2\),所以必然存在一个 \(j\) 使得 \(f(j-1)=2,f(j)=4\) 或 \(f(j-1)=3,f(j)=5\)。
考虑从前向后找到这些 \(j\),然后如果 \(f(r)>0\) 则进行调整。
考虑 \(f(j-1)=2,f(j)=4\),则我们把第 \(j\) 个操作(\(A\) 操作)放在中间一列,然后左右镜像一下,发现这个时候 \(f'(j)=-2\),因为后面操作不变,所以 \(f(r)\to f(r)-6\)。
考虑 \(f(j-1)=3,f(j)=5\),注意 \(f(j-2)\) 一定是 \(1\),否则会被前面调整。
所以意味着第 \(j-1,j\) 操作都是 \(A\),那么我们把这两个操作分别移动到中间和右边,然后镜像,发现 \(f'(j)=-1\),因为后面操作不变,所以 \(f(r)\to f(r)-6\)。
模拟赛 #1
总结
赛时 t1 在想数据结构优化 dp,后面才想到可以贪心直接算。然后读题不仔细,没注意到不同方案的区分,最后才意识到性质,得出做法。
t2 一开始在想平衡树直接维护,但是比较麻烦。没有用到前 \(10\) 大的性质。
一些比较简单的匹配问题可以直接贪心,dp 优化考虑找到重要的性质。
A / 9019 10303
被硬控 1h。。
我们按值相同的分段算,注意到一个前缀段,两个人选择的个数的差不超过 \(1\),然后 dp 直接记录差值就线性了。
B / 9019 10673 / P6544
注意到每次修改后的值一定是前 \(10\) 大,所以暴力修改前 \(10\) 大的 rk,插入当前 rk。
复杂度 \(O(qk\log n)\)。其中 \(k=10\)。
C / 9019 4203 / CF1334 F
\(f(i)\) 表示当前 dp 到 \(i\),并且 \(i\) 被选为 \(b\) 中被保留的那个的代价。
然后转移是区间加,查询是单点查询。使用树状数组 \(1.3s\) 跑 \(O(n\log n),n=5\times 10^6\)。
线性做法:待补。
D / 9019 10473 $^?$
正确性证明:待补。
题单 #2
A / AGC048 D
有意思题。
考虑 dp,\(f(l,x,r,y,0/1)\) 表示当前 \(a_l=x,a_r=y\),\([l,r]\) 左右被删完了,当前谁先手,最后先手是否赢。
然后转移可以枚举先手是删完还是删一些。
注意到对于固定的 \(l,r,x\),随着 \(y\) 的变化,\(f\) 值只有两段。
我们考虑把 \(f(l,r)\) 看做一个平面,\(x,y\) 作为坐标轴。
通过手摸 \(r-l+1\leq 3\) 的部分,我们可以归纳得到:
对于 \(f(l,r,*,*,0/1)\),\(f=1\) 的部分在平面上可以由一个 \(k=0\) 的直线和 \(k=1\) 的直线下方的并表示。
有一些细节不想说。反正这个分段函数的分段点可以由 \(g(l,r,0/1)\) 表出。
然后转移稍微推推就弄出来了。然后就做完了。
复杂度 \(O(Tn^2)\)。需要注意的是无解情况下 \(g\) 的值。
好像有更聪明的思考路径和做法。。
B / CF1693 F
首先观察样例操作,发现都有 \(cnt_0=cnt_1\),所以我们猜测最优操作一定可以表示为多次 \(cnt_0=cnt_1\) 的操作。
证明是简单的,我们考虑如果有一次 \(|cnt_0-cnt_1|>0\),对两端点的值讨论一下,可以得出不劣的转换方法使得 \(|cnt_0-cnt_1|\) 更小。
然后考虑怎么构造。
考虑一次操作,我们想尽可能多的固定值,所以一个想法是:
找到最右侧的 \(j\) 使得存在 \(i=0\) 或 \(i\) 位于左侧已经固定的 \(0\) 段中,并且 \((i,j]\) 满足 \(cnt_0=cnt_1\)。然后操作 \((i,j]\)。
正确性证明,考虑数学归纳法加上反证:
对逆序对数归纳,首先当逆序对为 \(0\),即排序好的,该策略一定最优。
然后对于某情况 \(S\),通过反证,分类讨论 \([l,r]\),证明不存在先操作 \([l,r]\) 会更优即可。
要想看出贪心策略还是要多练。。
$^!$ C / CF1801 G
我们把出现在 \(s\) 中的字符串称为 \(ss\)。
首先我们只考虑 \(b\in [l,r]\) 的方案数,可以使用 \(s\) 的 AC 自动机求出 \(b=x\) 的方案数,然后前缀和。
然后考虑减掉 \(a\in[1,l),b\in[l,r]\) 的方案数。
-
方法一
考虑我们直接枚举 \(ss\) 的哪一个字符是 \(a\),然后考虑建一个 \(rev(s)\) 的 AC 自动机(称为 IAC),令 \(pl,pr\) 分别表示 \(ss[1:a],ss[a+1:]\) 在 AC,IAC 里的位置。
然后问题变成询问有多少组 \([u,v]\) 满足 \(u\) 在 \(pl\) 的 fail 子树里,\(v\) 在 \(pr\) 的 fail 子树里,并且满足 \(b\leq r\) 的方案数。
这里我一开始想的是,在这个位置就处理 \(b\leq r\) 而不是在查询的时候处理,所以变成三维偏序要两只 log。
求出在 AC 上 \(t[1:l-1]\) 的位置 \(tl\),IAC 上 \(t[l:]\) 这个后缀的位置为 \(pt\),则:
首先满足 \(b\leq r\),即 \(len_{pt}\leq r-l+1\),倍增跳 \(pt\) 到达第一个满足要求的祖先即可。
然后问题变成有多少个 \((pl,pr)\) 使得 \(tl\in T(pl)\land pt\in T(pr)\)。其中 \(T(x)\) 表示 \(x\) 的 fail 子树。这是二维数点。所以做完了。
-
方法二
考虑我们找到 \(b\) 最大的使得 \(a\in[1,l)\land b\in[l,r]\) 的 \(ss\),我们发现,计数方式可以看做:
- 对于 \(b'\in(b,r]\) 的 \(ss\),一定合法。
- 对于 \(b'\in [l,b]\) 的答案,可以预处理这个 \(s\) 串后缀的前缀 \(ss\) 个数,然后答案就是一个后缀和。
预处理这玩意同样考虑 IAC,限制 \(len\leq C\) 就是跳祖先解决。
也是做完了。
$^!$ D / CF671 E
考虑把限制写成有关前缀和的不等式。
然后问题可以简化为,求出最大的 \([l,r]\) 区间使得:
存在方法使得同时对 \(a,b\) 进行后缀加,最多 \(k\) 次,可以满足
- \(\forall i\in[l,r],a_i\geq a_{l-1}\)。
- \(\forall i\in[l,r],b_i\leq b_r\)。
我们考虑先枚举 \(l\),同时按照最优方法处理掉 \(a\) 这个限制,然后上数据结构快速求出最大的满足限制 \(b\) 的 \(r\)。
最优方法处理 \(a\) 的限制,就是考虑从 \(a_n\) 扫到 \(a_l\) 的单调栈,需要后缀加的位置都在单调栈上。
观察到,假设我们要 check 一个 \(r\) 是否合法,我们先找到最优方案:
在满足 \(a\) 限制的前提下,对于没有用完的后缀加全部加到 \(b_r\) 上面。
所以 \(b\) 的限制可以改写为:令 \(b'\) 表示在满足 \(a\) 限制时 \(b\) 顺便被加到 \(b'\),则:\(\max_{i=l}^rb'_i\leq b_r+k\)。
这种东西考虑线段树上二分求解。
我们考虑对于 \(r\) 二分到的区间 \([u,v]\) 设分界点 \(p\):
如果 \(\max_{i=p}^vb_i+k\geq \max_{i=u}^{p-1}b'_i\),则答案必然在 \([p,v]\) 中。否则在 \([u,p)\) 中。
证明考虑 \(\max_{i=p}^vb_i+k\geq \max_{i=p}^vb'_i\)。
E / CF1975 I ~
F / CF1773 L ~
G / AGC060 D ~
H / P10042 ~
I / AGC026 F ~
J / CF1707 F ~
模拟赛 #2
总结
赛时 t1 没想到找到每个限制最上面合法的点,被卡了两个小时。
t2 不会欧拉回路构造。
t3 正常发挥。t4 见过原。
考虑多个限制的交,但是最后只要求任意一个在交中的元素,可以考虑对每个限制取一个稍宽松的弱化限制,然后取这些弱化限制的交的某个特殊元素。t1 取的是 dep 满足要求的最小的。
A / 9019 4216
考虑弱化限制为 \(\text{kfa}(\text{lca}(u,v),d)\) 的子树的交集。
然后取 \(\text{dep}\) 最大的那个,判断是否满足所有要求即可。
正确性,考虑如果在这个点子树内,那么会让其他限制岔开到其他子树内,更难满足要求。
B / 9019 4113 $^?$
首先有结论,\(a_i\in [-1,1]\)。
考虑如果有奇数个儿子,则该点 \(a_i=0\),如果有偶数个儿子,那么 \(a_i=\plusmn 1\)。
所以无解的充分条件是,存在 \(i\) 使得 \(\deg i\not\equiv \deg i+n\pmod 2\)。
问题就变成 \(a_i=1\) 还是 \(a_i=-1\)。
考虑 \(a_i\) 的子树内 \(1,-1\) 的个数要相同。
这种把集合分成两相同部分的题目,可以考虑(根据联通块出入度相同,边黑白染色等方法)构造图,然后跑欧拉回路。
考虑如果有偶数个儿子,则该点度数是奇数,如果要跑欧拉回路要加一条边。
注意到,如果点 \(i\) 度数是奇数,那么另一棵树编号相同的点 \(i+n\) 度数也是奇数。
所以考虑这么加边:对于这样的点,我们把这个点和另一棵树编号相同的点连边,这样就变成偶数度数。
然后考虑怎么填 \(a_i\)。已经知道欧拉回路的性质是连通块出入度相同,所以把 \(a_i\) 和出入度绑上。
考虑如果边被定向为 \(i\to i+n\) 则 \(a_i=1\),否则 \(a_i=-1\)。于是做完了。
正确性证明:考虑 \(x\) 子树内不考虑 \((x,fa(x))\) 边,入度和出度的差最多是 \(1\),因为差只能由父亲边更改。
C / 9019 4139
讨论一个位置 \(i\) 是从左边取到的还是右边取到的,拆成两个区间 \(x_1(i),x_2(i)\) 表示取到之前的区间是什么。还有两个区间 \(y_1(i),y_2(i)\) 表示取到之后是什么。
然后考虑转移,一个 \(y\) 区间的转移可以从包含他的 \(x\) 区间转移过来。
把这个 \(y_k(i)\) 区间的答案赋到 \(x_k(i)\) 上,然后加进去维护。
然后发现这就是二维数点板子。
需要注意的是,可能会出现两个区间重叠的情况(不会更多),一种是对于相同区间合并处理,一种是转移两遍。
* D / 9019 4270
同样是注意到把 \(n\) 个包含 \(4\) 个点的点集均分成 \(n\) 个包含 \(2\) 个点的点集。所以考虑欧拉回路。
我们发现答案一定是 \(0\)。考虑构造,如果 \(i,j\) 满足 \(v_i+v_j=4n+1\),则 \((i-1)/4,(j-1)/4\) 连边。也就是把所属的颜色连边。选择这条边意味着同时选择了 \(i,j\)。
然后注意到每种颜色 \(4\) 条边,可以跑欧拉回路。
然后考虑均分。注意到是要平分点的邻边,所以考虑按照回路上边的顺序黑白染色,黑色一个集合白色一个集合,这样就做完了。
题单 #3
A / QOJ 964 ~
B / QOJ 967 ~
C / P9528 ~
D / AtCoder xmascon22_f ~
E / AtCoder ddcc2017_final_d ~
模拟赛 #3
总结
没有什么蠢比问题。但是赛时没有想出来 dp 数组差分不超过 1,以及怎么位运算转移。
A / 9019 10458
直接贪心就做完了。
B / 9019 10594 / P7172
考虑 \(\deg>2\) 的点只有 \(O(n)\) 个,然后只要快速期初一个点最近的 \(\deg>2\) 的祖先是谁,然后答案就是两个点祖先的 \(\text{lca}\)。
注意祖先相同的情况。
求最近 \(\deg>2\) 祖先,可以使用可持久化线段树上二分。
C / LOJ 6564 $^?$
科技。
考虑朴素 lcs dp,设 \(f(l,r)\) 表示左侧位于 \(l\),右侧 \(r\) 的答案。
注意到 \(\forall l,r,f(l,r)-f(l,r-1)\in[0,1]\)。
所以考虑做差分,然后用 bitset 维护差分数组,以通过位运算加速。
然后考虑转移。假设 \(a_l\) 出现位置是 \(pos(a_l)\)。
设 \(g=f(l-1)\text{ or }pos(a_l)\),则:
\(f(l)=((g-f\text{ lsh }1-1)\text{ xor }g)\text{ and }g\)。
复杂度 \(O(n^2/w)\)。
D / P4194
考虑网络流 行列同时限制 的经典套路:
把行列分别作为一个点,则一个位置的值可以用连接行列的边来表示。
然后发现要求就是流量又上下界。二分跑有上下界可行流就好了。
题单 #4
A / QOJ 3502
树上邻域。注意到 \(d\leq 40\)。所以考虑枚举这个点到其 \(d\) 级祖先的链。
考虑 \(f(x,d)\) 表示对 \(x\) 的距离为 \(d\) 的儿子乘上 \(f(x,d)\)。
则暴力做需要对每个 \(\leq d\) 级祖先 \(x\) 的每个 \(f(x,d'\leq d)\) 做一遍,复杂度不可接受,并且不一定有逆元。
考虑 \(f(\text{kfa}_j,i)\) 乘以 \(w\) 的时候,需要让 \(f(\text{kfa}_{j-1},i-2)\) 除以 \(w\),但是又被他本来乘上的 \(w\) 抵消了,所以我们只需要更改 \(O(d)\) 个位置。复杂度是对的。
B / QOJ 6537
首先考虑一定存在一种方案使得其他小段的长度都为 \(1\)。
我们考虑大段 \([l,r]\),有一个必要条件是,\(\sum_{i=l}^r a_i>\max(a_{l-1},a_{r+1})\)。
但是注意到如果直接这样做,很难优化,因为我们固定了小段的长度,限制变严格了。
考虑小段长度不固定。考虑最优解的大段是否仍然满足 \(\sum_{i=l}^r a_i>\max(a_{l-1},a_{r+1})\)。
发现是满足的,所以我们把问题变为了,找到最多的 \([l,r]\) 使得两两不交,并且满足大段的要求。
对于这种问题,我们有经典贪心,也就是找到右端点最小的,然后贪心加入。
所以我们维护 \(f(r)\) 表示最大的 \(l\) 使得 \([l,r]\) 可以成为大段。
然后暴力求解一次询问,就是考虑从 \(x=l-1\) 开始,每次找到最小的 \(r\) 使得 \(f(r)>x+1\),然后 \(x\gets r\)。
所以对于固定的 \(x\),下一个 \(r\) 是固定的。我们预处理出 \(r=nxt_x\)。
考虑 \(nxt_x\),我们发现可以暴力求。因为如果 \(nxt_x\neq r\),则意味着 \(a_r\geq \sum_{i=x}^{r-1}a_i\),意味着 \(nxt_x\to r+1\) 后,大段的和会至少翻倍。
所以 \(nxt_x-x=O(\log V)\)。
所以单点修改也只要改 \(O(\log V)\) 个 \(nxt\)。
然后考虑怎么快速维护 \(l\) 跳多少次 \(nxt\) 可以到 \(r\)。一种是注意到 \(nxt\) 一次只有 \(O(\log V)\) 步,所以线段树维护区间前 \(\log V\) 个位置跳出区间的情况,这样复杂度是 \(O((n+q)\log n\log V)\)。
求解就是枚举第一个和最后一个区间是不是小段,分 4 种情况就好了。
当然,也可用弹飞绵羊那题的方法,使用分块维护 nxt,复杂度 \(O((n+q)\sqrt n)\)。
C / QOJ 3508
考虑(网格图)一条路径必经的条件,可以考虑如果经过这条路径左右的路径,代价是什么,进而列出不等式。
我们发现,如果路径在第 \(y\) 列有纵向行走,意味着 \(a_y\) 是 \((i,a_i)\) 凸包上的点。
然后 \(a,b\) 两边贪心做,每次判断 \(a,b\) 两个凸包的当前枚举到的边那一条小走那边。
D / QOJ 6338 ~
E / QOJ 8646 ~
F / QOJ 6342 ~
模拟赛 #4
总结
t3 Narayana Number 赛时不会证明,然后发现证明用的怎么是我学过的 Raney 引理。。
证明考虑一开始 +1,然后枚举 \(k\) 个 +1 连续段,然后做插板。然后前缀和非负,并且 \(sum=1\),使用 Raney 引理。
A / 9019 185588488
显然有下界是真前缀为排列的个数,然后显然存在构造。字典序最小也是显然的。
B / 9019 185588489
考虑倒着 bfs,然后只关心四个方向最近的可以到达的点,预处理一下,复杂度平方。
不需要写序列并查集。
C / 9019 185588490 $^?$
瞪眼可得,枚举折线的峰,如果有 \(k\) 个,那么方案数 \(N(m,k)\binom{n-2k+1+2m}{2m}\)。
\(N(m,k)\) 表示折线 \(k\) 个峰的方案数。
所以 \(N(m,k)\) 是 Narayana Number。
D / 9019 185588491
\(O(n\sqrt n\log n)\) 做法。
考虑极长合法段是不交的。考虑根号分治。
如果 \(len\geq \sqrt n\),则有 \(O(\sqrt n)\) 段,在查询的时候暴力。
如果 \(len<\sqrt n\),考虑直接对区间内的每个数记上区间长度。
查询的时候特判跨越 \(L,R\) 的区间,然后查询中间包含 \(x\) 的区间长度的最大值。
\(O(n\log^2 n)\) 做法过于困难了。
题单 #5
题单有点过于难了。
A / AGC059 C ~
B / QOJ 7774 ~
C / P11567 ~
D / AGC051 F ~
E / AGC053 F ~
F / AGC067 E ~
G / P8478 ~
模拟赛 #5
A
考虑贪心。贪心顺序是二元环三元环四元环。可以通过调整证明。
B
考虑每次先无脑打下来,然后到某个位置体力不够了,就不断撤销 撤销后可以获得最大体力 的位置,直到可以跳过。显然这样撤销次数最少。
因为撤销一次意味着要多花费 \(B\) 的体力。所以当然是撤销越少越好。
C
考虑最后肯定是一个矩阵优化 dp 的形式,所以一定有线性递推式。打表打出来 \(n\) 小的答案,然后就可以求出来了。
因为递推式很短,所以可以高斯消元求解。
D ~
集训队互测屎题。不想订正。
其他
集合幂级数相关
APIO 2025《集合幂级数在子图计数问题上的应用》 by cxy
乘法,集合并乘法
就是子集卷积,or 卷积。
exp,ln,inv / P12330~12332
集合幂级数 \(f=\sum_S a_Sx^S\) 做 exp 的一种方法是:
令 \(f_i=\sum_{popcnt(S)=i} a_Sx^S\),然后设 \(F_i=FMT(f_i)\)。
然后对每个 \(S\),对多项式 \(\sum_{j=0}^n z^j[x^S]F_j\) 做多项式 \(\exp\),设结果为 \(g_S\)。
这里多项式 \(\exp\) 因为 \(n\) 非常小,所以可以直接 \(O(n^2)\exp\)。
然后把 \([z^j]g_S\) 填回 \([x^S]F_j\)。然后对每个 \(F_i\) 做 iFMT。
令 \(H_S=[x^S]F_{popcnt(S)}\),则 \(\exp f=H\)。
对于 \(\ln f,\text{inv }f\) 都是一样的。
* ARC105 F
旧题新做。
设 \(G_S\) 表示(不一定联通的)子图 \(V=S\) 的方案数。每个连通块左右部可以自由交换。
那么考虑 \(F_S\) 表示联通的,左右部可以自由交换的方案数。
则 \(F=\ln G\)。然后答案左右部交换视为同一种,所以是 \(f_U/2\)。
然后是 \(G_S\) 怎么求。枚举左部点 \(T\),则方案数就是 \(\sum_T 2^{e(S)-e(T)-e(S-T)}\)。
然后考虑等于 \(e(S)\sum_T 2^{-e(T)}2^{-e(S-T)}\),后面求和显然是子集卷积。
所以 \(G\) 可以 \(O(n^22^n)\) 求出。整个复杂度也是 \(O(n^22^n)\)。
QOJ 5411
考虑杏仁可以看作是,起点、终点、一堆链 拼起来的产物。
所以考虑 \(G_S\) 表示这些链的并是 \(S\) 的方案数,则我们求出单个链 \(S\) 的方案数 \(F_S\),则 \(G=\exp F\)。
然后求出一条起点是 \(s\),终点是 \(t\),点集为 \(S\) 的链可以状压 dp。
考虑一次询问等于选定一个点必须是链首。所以我们枚举这条链,然后和其他的拼起来就好了。
复杂度 \(O(n^22^n)\)。
QOJ 6954 $^?$
考虑环的交是很抽象的。直接要求环的交在点集里是困难的,所以考虑先观察性质,把环的交简化掉。
通过一些画图,我们发现,如果有超过两个环,所有环的交集只能是不超过两个点。
所以我们分类讨论;
- 树。矩阵树定理求解。
- 基环树。
枚举环(设环的大小为 \(i\)),然后缩点跑矩阵树。 - 存在至少一个点,使得删去该点后,无环。
枚举删去的点,然后剩下的是一些森林,然后森林中的点向这个点至少有一条边。需要用 \(\exp\) 把森林转化为树做。 - 存在至少两个点,使得删去该点后,无环
枚举删去两个的点(两个点之间的边随意),然后剩下的是一些森林,然后森林中的点向这个两个点一共至少有一条边。同样 \(\exp\) 解决。
但是会出现,如果两个点中间没有边,且每个连通块都只向恰好一个点连边,那么会出现恰好两棵树构成的森林,扣掉这种情况就好了。
设四个的答案为 \(a,b_i,T_1,T_2\)。
则答案为 \(T_1-T_2+(\binom{n}{2}-n+1)a+\sum_i (\binom{i}{2}-i+1)b_i\)。
QOJ 2068 $^?$
考虑集合幂级数的做法。
考虑匹配直接做比较困难。能不能把一些匹配连起来一起考虑。
注意到匹配只会让每个点 \(\deg\leq 1\),所以这里的套路是:在此基础上考虑 \((2i,2i+1)\) 连边,这样每个点 \(\deg\leq 2\),所以这样连边的图是一些环和链。
同时这样连边,相当于两个点合并成一个点。所以 \(n\) 直接砍半到 \(18\)。
我们令 \(F_S\) 表示 \(S\) 作为一条链或一个环的权值和。这里可以状压 dp 求出,也就是设 \(f(S,i)\) 表示当前链包含 \(S\),链头为 \(i\) 的方案数。
然后 \(G=\exp F\)。答案即为 \(G_U\)。
复杂度 \(O(n^22^n)\)。
AT_xmascon22_f $^?$
令 \(n'=\lfloor\frac{n}{2}\rfloor\)
要求匹配为 \(k\in[0,n']\) 的个数。
集合幂级数不太好做。瞄了一眼有 dp 做法。想了想大概会了。
考虑令 \(f(i,S)\) 表示当前 dp 了 \(i\) 个链(和若干个环),包含了点集 \(S\) 的方案数。
考虑怎么转移。为了不重复,所以我们钦定新的环链的最大点是当前最大的未选点 \(x\)。也就是 __lg(S^U)。
然后考虑链怎么加入。考虑我们先 dp \(2x\) 左侧的点,然后 dp \(2x+1\) 右侧的点。注意 \((2x,2x+1)\) 有一条边。
所以令 \(g(S,i,0/1)\) 表示选择了 \(S\) 左侧还是右侧,当前 dp 到 \(i\) 的方案数。
因为我们要知道一开始的 \(x\) 是多少,为了不额外记录,我们一开始不把 \(x\) 填进 \(S\)。最后 \(g\to f\) 的时候才填。
因为多一条链意味着少一个匹配,最后答案 \(ans_i=f(n'-i,U)\)。
看起来复杂度 \(O(n^32^n)\)。但是注意到,对于 \(i\),合法的 \(S\) 只有 \(2^{n-i}\) 种。所以是 \(O(n^22^n)\) 的。
* CF1193A
这个问题是,对一个 DAG 重定向的代价是边不同的个数。问所有方案的代价和。
考虑直接计数很困难。考虑找不变的东西。我们发现,一种重定向方案和 把这个方案的边全部翻转 的方案的代价和是 \(m\)。
所以我们只要对方案数计数,然后乘上 \(\frac{m}{2}\) 就好了。
考虑 \(f(S)\) 表示 \(S\) 中的点构成 DAG 的方案数。
然后 DAG 计数的一般套路是,枚举入度为 \(0\) 的点,一层一层剥。
\(f(S)=\sum_{T\subseteq S,|T|>0}f(S-T)c(T)\)。也就是我们钦定 \(T\) 是入度为 \(0\) 的点。但是可能 \(S\) 中的还是有入度为 \(0\)。所以要乘上容斥系数 \(c(T)\)。
考虑 \(c(T)\) 怎么算。我们注意到,恰好 \(T\) 是 \(0\) 入度点的情况,会被 \(\sum_{S\subseteq T}c(S)\) 算一遍。
所以要求 \(c(\varnothing)=0,\sum_{S\subseteq T}c(S)=1\)。子集反演得到 \(c(T)=\sum_{S\subseteq T,|S|>0}(-1)^{|T|-|S|}=(-1)^{|T|+1}\)。
所以最后的转移是 \(f(S)=\sum_{T\subseteq S,|T|>0}f(S-T)(-1)^{|T|+1}\)。
计数
容斥 / 拆贡献
ARC118 E
考虑不经过关键点比较难算。所以我们钦定经过关键点集合 \(S\)(不经过给出的关键点)
那么钦定经过关键点 \(S\) 的方案数 \(f(S)\),那么恰好经过 \(S\) 的就是 \(g(S)\)。
有 \(f(S)=\sum_{S\subseteq T}g(T)\)。
所以 \(g(\varnothing)=\sum_{S\subseteq T}f(T)(-1)^{|T|}\)。
考虑计数 \(f(T)\)。我们考虑按照路径 dp。
设 \(dp(i,j,k,0/1,0/1)\) 表示当前位于 \((i,j)\),已经经过了 \(k\) 个(钦定的)关键点,当前行是否有(给出或钦定的)关键点,当前列是否有(给出或钦定的)关键点。
转移是简单的。最后答案就是 \(\sum_{i=0}^m dp(n+1,n+1,i,0,0)(-1)^i(m-i)!\) 其中 \(m\) 是未给出的关键点数量。因为其他关键点是否被经过是不重要的,所以直接乘上 \((m-i)!\)。
ARC188 D $^?$
首先思考一下,我们发现,\(rk=i\) 的串,其第一个数一定是 \(\lceil\frac{rk}{2}\rceil\)。
考虑什么情况下不合法。去掉一些平凡情况,我们发现,对每个 \(k\),如果 \(2k,2k+1\) 同时存在,则在这两个位置所属行 \(x,y\) 的点连 \(x\to y\) 的边。如果存在一个点可以沿有向边走到自己则不合法。
然后考虑填数在图上相当于什么操作。填入一个数会让一个 \(k\) 新满足 \(2k,2k+1\) 同时存在,所以相当于在图上新增一条边。
所以问题变成,现在已经有一些边,我们要求出加边方案使得不存在一个点可以沿有向边走回自己。
说人话就是,不存在一个(无向)环上的定向相同。
所以我们把当前的连通块分类,分为 已经成环,为链并且存在不同定向,为链并且定向均为左/右 四种情况。
设方案数 \(c_0,c_3,c_1,c_2\)。
然后计数不合法情况。
枚举选择 \(i\) 个左定向的链,拼成 \(x\) 个左定向的环,\(j\) 个右定向的链,拼成 \(y\) 个右定向的环。其他的随便。
则方案数是 \(\sum_x\sum_y(-1)^{x+y}\sum_i\sum_j\binom{c_1}{i}\binom{c_2}{j}s(i,x)s(j,y)(c_1-i+c_2-j+c_3)!\)
其中 \((c_1-i+c_2-j+c_3)!\) 表示对剩下的随便排列。我们以前缀最小值为划分,发现和合法的所有成环情况形成双射。
其中 \(s(i,x)\) 表示 \(i\) 个物品分到 \(x\) 组圆排列的方案数。也就是第一类斯特林数。
有结论是 \(\sum_{i\leq n}s(n,i)(-1)^i\) 只有 \(n=0,n=1\) 有值 \(1,-1\),对 \(n>1\),值恒为 \(0\)。
所以我们把式子变为 \(\sum_i\sum_j\left(\sum_x(-1)^x s(i,x)\right)\left(\sum_y(-1)^ys(j,y)\right)\binom{c_1}{i}\binom{c_2}{j}(c_1-i+c_2-j+c_3)!\)
然后我们只要枚举 \(i\leq 1,j\leq 1\)。复杂度线性。
AGC005 F
一开始想容斥之类的没有思路,然后考虑反过来,把边贡献到答案。
然后我们枚举边 \((u,v)\in E\),不妨设 \(sz_u<sz_v\)。考虑对 \(ans_i\) 的贡献是边两侧都有点的方案数,也就是 \(\binom{n}{i}-\binom{sz_u}{i}-\binom{n-sz_u}{i}\)。
然后考虑暴力是 \(O(n^2)\) 的。
然后,对每条边和每个 \(i\) 都要求一遍,自然可以想到用卷积优化。
然后把组合数拆开,随便构造就好了。
CF468E $^?$
首先我们把 \(w\) 拆成 \(1+(w-1)\)。 表示这个位置可以选择 \(1\)(不变)或者 \(w-1\) 作为额外方案。这样就不需要记方案数做减法之类的。
考虑暴力。我们按照列进行 dp,维护哪些行被选了。感觉复杂度是 \(O(2^k\text{poly}(k))\) 的,但是我们发现:
我们可以把状态合并,注意到某一行 \(x\) 上最后一次出现的关键点的位置是 \((x,y)\),那么 dp 到 \(y\) 之后,可以直接忽略 \(x\) 这一行是否被选。
这样,我们发现需要被维护的行,必须要有至少两个关键点,那么只有 \(k/2\) 行需要维护。所以复杂度是 \(O(2^{k/2}k^2)\) 的。但是完全跑不满。
还是要考虑剪剪枝,说不定就能想到一些关键的优化。。
考虑可能的结果的形态
ARC178 D
考虑合法当且仅当插入的数满足比他小的数的位置都在同一侧。
所以不妨设 \(f(i,l,r)\) 表示当前填到 \(i\),\([l,r)\) 是包含 \([0,i]\) 的最小区间的方案数。
那么转移就是要求 \(i+1\) 不能在 \([l,r]\) 中。枚举 \(i+1\) 的位置并更新 \(l,r\),复杂度四次方,前缀和优化到三次方。
QOJ 7649
考虑从前向后 dp,dp 记录 \(f(i,j,k)\) 表示填了 \(i\) 个数,有 \(j\) 种 \(k\) 表示 120 中当前 12 中最大的 1 值为 \(k\)。
然后加入一个新数,分类讨论是插入一个新值,还是不新增值。
有转移 \(f(i,j,k)\to f(i+1,j,\max(k,c-1))(c\geq k),f(i,j,k)\to f(i+1,j+1,c-1)(c>k)\)。
这里 \(c\) 的限制是为了防止出现 120。
然后直接 dp 是 \(O(n^4+qn)\),前缀和优化到 \(O(n^3+qn)\)。
AGC027 E $^?$
考虑,这样在序列上做神秘替换操作的题目,我们最好找到一个不变量来做限制。
一种套路是,我们把每种字符映射到一个整数,然后操作在模意义下不改变字符串的元素和。
然后这道题,我们让 \(\texttt{a}\to 1,\texttt{b}\to 2\)。注意到这样每次操作,字符串的数字和在 \(\bmod 3\) 意义下不变。
考虑一个字符串 \(s\) 是否可以变为 \(t\)。因为是计数,所以我们需要用唯一的变化方法来刻画。
首先我们贪心地找到一个必要条件,对于 \(t\) 的每个字符,找到 \(s\) 的一段前缀使得前缀和和这个字符对应的数字相同,且至少存在一对相邻相同位置,然后删去这段前缀。如果每次都能找到,最后 \(s\) 的数字和为 \(0\),那么合法。
这个条件唯一确定了一个 \(s\to t\) 的过程。
然后考虑这个条件是否充分。
我们发现,通过调整,一定可以构造出 \(s\to t\) 的方案。所以我们只要对这个 dp 就好了。
考虑倒着做。\(f(i)\) 表示当前 dp 到 \(s_i\) 的方案数。然后转移维护两种情况的位置就好了。
ARC138 F $^?$
很厉害的题。
首先状态设计是简单的,维护 \(f(pl,pr,vl,vr)\) 表示当前 dp 到的矩形。状态数是四次方的。接下来用 \(f(S)\) 表示这个矩形中的点集为 \(S\)。
首先我们枚举第一次操作的位置。然后考虑重复计数了什么。
一个想法是这样的,注意到我们考虑 \(x,y\) 更大的操作的时候,会用到 \(x,y\) 更小的操作的信息,所以我们把操作按照 \(x_1,y_1,x_2,y_2\cdots x_m,y_m\) 按顺序标号为 \(1,2,\cdots 2m\),然后按照这个顺序考虑。
首先有(带重复的)方案数是 \(\sum_k f(S_k)f(S-S_k)\),其中 \(S_k\) 表示编号为 \(k\) 的操作后被分割出来的前半部分。
然后考虑重复当且仅当 \(S_k\) 中存在一种方案,可以先在里边操作一次,然后再在外面操作。
所以我们枚举方案。考虑分类讨论:
如果 \(S_k\) 中的 \(w\) 的切割方向和 \(k\) 的方向相同,那么方案数是 \(f(S-S_k)\sum_w g(S_w)f(S_k-S_w)\)。其中 \(g(S_w)\) 表示 \(S_w\) 中,\(w\) 一定是最先切的方案数。
如果不同,我们注意到,假设 \(k\) 竖着切,\(S_k\) 中的 \(w\) 是横着,那么如果第四象限(至少一个点)有点 \(A\),切出来的第二象限一定是有点的,因为 \(|S_w|\leq |S_k|\Rightarrow|S_w-\{A\}|<|S_k|\)。
所以如果存在 \(A\),那么第二三象限都有点,这意味着二者的操作顺序必然会改变。所以 \(A\) 一定不存在。
所以 \(S_w\) 只能在第三象限。故 \(w\in S_k,S_w\subseteq S_k\)。
同理,\(k\) 横着 \(w\) 竖着的限制同样是 \(w\in S_k,S_w\subseteq S_k\)。
所以我们得出了:\(g(S_k)=f(S_k)-\sum\limits_{w\in S_k,S_w\subseteq S_k} g(S_w)f(S_k-S_w)\)。
然后有 \(f(S)=\sum_k f(S-S_k)g(S_k)\)。
一开始在考虑两维分开,但是后面意识到可能会有两种切割方向不同的重复情况,然后脑袋就宕机了。
考虑可能的组合过程
$^!$ ARC193 C
考虑倒着做。考虑最后一个填入的位置,会让一行一列都变成该颜色。然后我们接下来只要删除这一行一列考虑就好了。
然后考虑 dp,设 \(f(i,j)\) 表示 \(i\) 行 \(j\) 列网格的方案数。
然后我们枚举同色行列的个数 \(x,y\)。
分类讨论,如果 \(x,y\neq 0\),则只能有恰好一种颜色。否则颜色可以有多种。
有 \(f(i,j)=\sum_{x\geq 1}\sum_{y\geq 1} f(i-x,j-y)c(x,y)C+\sum_{x\geq 1}f(i-x,j)c(x,0)C^x+\sum_{y\geq 1}f(i,j-y)c(y,0)C^y\)。
其中 \(c(x,y)\) 是容斥系数。
所以先考虑 \(y=0\),那么有 \(\sum_{x\geq 1} \binom{i}{x}c(x,0)=1\),可得 \(c(x,0)=(-1)^{x+1}\)。
\(x=0\) 同理,有 \(c(0,y)=(-1)^{y+1}\)。
然后考虑 \(x\neq 0,y\neq 0\)。注意到这已经被 \(x=0\) 和 \(y=0\) 的情况算了两遍,所以有 \(\sum_{x\geq 1}\sum_{y\geq 1}c(x,y)=-1\),可得 \(c(x,y)=(-1)^{x+y+1}\)。
然后前缀和优化是简单的。
思维链还是有点太长了。。根本想不下来。
dp 类计数
ARC107 D
考虑暴力 dp。设 \(f(i,j)\) 表示选择了 \(i\) 个物品,当前还需要选择 \(j\) 个当前枚举到的大小的物品(也就是我们把当前枚举到的大小放在了一起算)。
然后转移是枚举当前大小选了几个,有 \(f(i,j)\to f(i+k,2(j-k))\)。
好蠢。注意到这其实是完全背包的变种,或者说我们不需要一次性枚举 \(k\),而是枚举当前是否进入下一个大小。。
NJUSC 2025
机试 #1
打得好难受啊。
A
直接枚举第一个人坐哪里,然后暴力模拟。复杂度看起来不错。
细节一万个。屎。
B
观察到路径一定是 \(x\in[xl,xr],y\in[yl,yr]\)。
然后枚举 \(xl\),维护每个 \(xr\) 对应的 \(xr+yr-yl\) 的最小值。
单调栈维护每个 \(xr\) 对应的 \(yl,yr\),线段树直接暴力更新。
C
防 AK。
先分类讨论,得到一个平方暴力。
然后有 \(\gcd=1\) 的限制。然后莫反做,拆掉一堆东西。
耐推王。
然后单点求 mu 用杜教筛。
机试 #2
A
简单题。随便构造。
B
原。还不会。
C
神秘交互。只会 ~85。
考虑 42 分。第 \(i\) 个位置放在 \(\frac{i}{n}\) 处,每个数找到最近的位置填进去。
63 分。考虑这样做的问题是,容错太低。不如把 \(100\) 个位置放到一起,也就是把第 \(i\) 个位置放到 \(\frac{1000\lfloor\frac{i}{1000}\rfloor}{n}\) 处。
这样两侧相当于随机填。并且一个位置左右侧的影响比较小。
然后是 85。考虑随机过程中可能当前随机的数“不太随机”,会导致填的位置有聚堆,所以在过程中挑几个时间重新把位置分组。

浙公网安备 33010602011771号