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))\)

然后有:

\[\begin{aligned} a(x)&=\max_{op\in\{-,+\}}\left(S(op)+M(op)\right) \\ b(x)&=\max_{op\in\{-,+\}}\left(S2(op)-op\ v_x\right) \\ c(x)&=\max_{op\in\{-,+\}}\left(S(op)\right) \\ d_1(x)&=\max_{op\in\{-,+\}}\left(S(op)+M(op)+op\ v_{fa(x)}\right) \\ d_2(x)&=\max_{op\in\{-,+\}}\left(-op\ v_x+op\ v_{fa(x)}+S(op)\right) \\ d(x)&=\max(d_1(x),d_2(x)) \end{aligned} \]

都啥意思:

  • \(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。考虑随机过程中可能当前随机的数“不太随机”,会导致填的位置有聚堆,所以在过程中挑几个时间重新把位置分组。

posted @ 2025-08-09 00:00  adam01  阅读(96)  评论(0)    收藏  举报