ATC 摸索记录
2023.9.15 鸽子更新了 ARC!!
ARC079
A:模拟。
B:考虑先构造一个最终状态,然后通过把一个数加 nn(保证它加完后是最大的), 其他数减 1 的操作得到初始序列。首先有一个结论是:按照这种方式进行操作,对于一个连续的值域 [l,l+n−1] ,操作 n 次后会变成 [l+1,l+n] ,于是直接模拟这个操作 kn 次 , 再从小到大把剩下 kmodn 次执行即可。
C:如果一个数 ≥n, 那么一定是会被减的, 于是模拟。把最大数找出来,可以算出多少次后 <n, 复杂度是 log1.02V 的。
D:容易发现图是个外向基环树,按照题目的要求可以对每一个挂着的节点做一次树形 dp, 求子树的 mex。然后可以直接枚举环上的点的权值,复杂度可以证明是 O(nlogn) 。看题解区还有一个结论:若环上所有点权相同且为奇环则无解。
ARC080
A,B:模拟。
C:很容易找到规律,用线段树来优化这个分治即可。
D:先把异或序列差分,此时有 1 的位置一定只有偶数个。
于是就变成了 P3943 星空, 结论是两两 1 匹配,费用是 px−py。 设 w=px−py, 考虑 w 要用几个奇素数拼出来。
-
若 w 为奇素数,一次即可。
-
若 w 为偶数 : 若 w = 2, 先取 5 再取 3 即可; 若 w = 4, 先取 7 再取 11 即可。
若 w > 4, 由哥德巴赫猜想(一个大于 2 的偶数可以写成两个奇素数的和)可知, 需要两个。
综上:若 w 为偶数, 需要 2 次。
-
若 w 为奇合数 : 若 w = 1, 取 5, 7, 13 即可。 若 w = 3,取 7, 27, 37 即可。
若 w > 3,可以把 w 写成 3 + (w - 3), 其中 (w - 3) 为偶数, 需要两次,故总需要 3 次。
综上:若 w 为奇合数, 需要 3 次。
直接建图是不行的,因为这是一般图最大权匹配问题。考虑贪心, 先尽量选权值为 1 的边,再选 2, 3。
按奇偶分类, 则奇偶之间的连边为奇数, 先把奇素数的边选了, 再在奇偶内部互相选,边权为 2。
若奇偶都有剩余,则选一个边权为 3 的边。
ARC081
A:模拟
B:肯定不能把矩阵转为图, 毕竟图染色是 NP 问题。考虑怎么利用列是 2 的性质。
可以从 1 开始递推, 每行的方案数只和当前行和上一行决定, 可以手推出方案数,每次乘上对应的方案即可, 不要算错了。
C:子序列自动机模板题。
D:转化 + 单调栈。
首先这个每次翻转一行一列求最大子矩形几乎没法 dp, 而且数据范围是 2000,大概率是 O(nm)算法,考虑有什么充要条件。
先找一些简单性质:
-
若一个矩形能被全黑, 则其所有子矩形都能全黑。 反之亦然。
-
若一个矩阵能被全黑, 则其所有行的状态与第一行的状态相同或相反。
Proof:因为操作是可逆的,而一个合法矩阵无论怎么操作都具有上面的性质。
这样就有一个 O(n3) 算法了, 枚举第一行判断。
继续发掘性质,我们找到矩阵的最小的“单位元”:2 × 2 矩阵(如果矩阵是 1 行或一列的话直判一下就好了)。发现对于所有的 2×2 矩阵, 翻转都不改变它的 1 个数的奇偶性。
那么根据第一个推论,只要我们保证一个矩阵, 它所有的 2×2 的子矩阵的奇偶性相同即可。
此时我们把所有的 2×2 的矩阵建出一个新矩阵,若它合法设为 1,否则为 0,那么答案就是最大的全为 1 的矩阵。可以单调栈判断。似乎网上对这个算法有一个特别的名字:悬线法??
ARC082
A,B:模拟
C:考虑这个 2n−|S| 的实际意义, n−|S| 是这个凸包包着的点的个数,2n−|S| 就是从这些点构成的集合中选出一些点的方案,在加上这些点, 于是每一个合法的答案就存在一个它的子集,使得这个子集是一个凸包。
会不会存在合法的子集会被重复考虑?不可能。
由于一个点集的凸包若存在,即唯一, 所以一个点集只会被一个凸包考虑。容斥一下, 就是总的方案数减去子集不能构成凸包的方案。
前者的方案数是 2n−1, 后者..考虑凸包的定义, 那么它们两两连线的夹角一定为 180 度,即它们在一条直线上。
于是我们枚举线段的两个端点, 算出它们的连线之间有多少个点,那么答案就是 2cnt。
D:不会分段函数 /ll
考虑把所有询问离线,按照时间顺序同时维护这 n 个沙漏的答案。
有一个很显然的性质:按照初始 A 中沙漏大小从小到大排序后,对于任何时间 t, 若 si<sj, 则 t 时刻 s′i<s′j。 显然。
于是把所有分割点排序, 用线段树模拟加 / 减沙子的过程。可以二分找出沙漏被完全漏完的区间, 剩下的就是区间加法, 区间赋值。
ARC083
A,B:暴力。
C:
设 f[x][i][j] 表示 x 子树中,与 x 同色的权值为 i, 异色为 j 的答案是否存在,转移的话直接背包, 复杂度 O(n4)。
然而..我们真的要 i 这一维吗?只要我们最后的 i≤Xk, 那么 所有的 f[x][Xk][j] 都存在, 由于此时 k 的一个贡献 Xk 是固定的。只要保证 f[x][i][j] 中 i≤Xk ,越小越好,所以对于一个 f[x][i],我们只用记录它异色最小的 j 即可。 优化到 O(n3)。
继续优化,我们发现最后只有 f[x][Xk] 才会贡献答案,所以 O(n2)。
D:
Difficuly:3541
神仙转化,这种东西真的是人能想的到的????
首先这种奇怪的顺序问题我们肯定要找到一种更好的东西去刻画。
由于一个每个机器人对应一个球,一个球可以由两个机器人选择,首先可以想到二分图匹配。但这个匹配是有先后顺序的,比如说一个 X 坐标的机器人要匹配一个 Y 的球, 那么所有 y∈[1,Y−1],(X,y) 的球要先被 y 坐标的机器人取得。 这种先后顺序似乎很难考虑。 而且,二分图怎么计数?
我们考虑把一个球 (x,y) 抽象成一条边, 向 X 和 Y 轴对应的机器人连边。 由于球有 2n 个,点有 2n 个, 那么最后建出来的图一定是一个基环树森林。
转化成基本的图论问题, 我们考虑最终球收集的对象。
我们把每条边定一个向,指向的那个点就表示这个球是由这个点收集, 那么每个点都会有一条入边,就是一个外向基环树森林。
有了最终的对应关系, 那么我们接下来要做的就是按照某个顺序 “点亮” 这些边, 但是这个 “点亮” 有限制条件, 比如说点亮的 (x,y) 指向 y, 那么我们要确保所有的 x′∈[1,x−1], 有 (x′,y) 已经被点亮。
注意到这很像拓扑排序:如果我们把所有的前置条件看做一条有向边,只有当一个点的入度为 0 时,才能选择。最后我们要对所有合法的拓扑序计数, 那么由于这是个森林,我们加一个超级汇点即可。
下面,不要把 “球”,“边”,“点” 弄混。
那么我们就先把边建出来。 注意到建出来的图很有性质,具体地:
- 如果把球的权值看做两个点的和, 那么一定是小球连向大球。
- 对于每个点,一定是它所有的出边向入边连边,因此一个球只会有一个出边。
因此,建出来的图是一个内向树。
内向树的拓扑序计数是容易的,设 dpu 表示 u 子树的拓扑排序方案, 有 dpu=(sizu−1)!×∏v∈sonudpvsizv!。
也可以直接记结论: ans=|S|∏xsizx,
对于每个基环树,分开计算答案,套用上面的柿子。因为要枚举边的指向,对于非环边,指向是唯一确定的。对于环边,其有顺时针和逆时针两种方案,加起来即可。
ARC084
A:模拟
B:建图跑最短路确实不好想。
考虑同余最短路, 设 fi 表示 modK=i 时最小的数位累加和, 有转移:
- fi+j→f(i+j)modK
- fi→fi∗10modK
答案就是 f0。
复杂度 O(KlogK),利用同余来设计转移着实巧妙。
C:大分讨,写 nm。
D:
** Difficuly:3397 **
第一个转化:把输入的 ai 看成二进制下的多项式,那么第一个操作就是 ×x, 第二个操作就是多项式的加法。
第二个转化:有了乘 x 操作和加法操作,我们能构造出什么?多项式的 gcd。
具体地, 定义两个多项式的 gcd 为 gcd(F,G) : 不妨设 degF≥degG, 记 P=G∗xdegF−degG
则有 gcd(F,G)=gcd(F−P,G) ,当 F,G 其中一个为 0 时, 另一个就是 gcd。
我们求出 gcd(a1,a2⋯,an)=C 根据 gcd 的定义, 我们最后构造出来的多项式一定是 C 的倍数。
第三个转化:所以,我们要求的合法的 S 满足 :
- S≤M
- S 为 C 的倍数。
第一个限制可以通过类似数位 dp 的方式依次钦定最高位为 0, 其它任选的方案。
第二个要求 S 为 C 的倍数,设 c=degC, 不难证明,若我们钦定了 S 的高位,只剩下 c−1 位没有选, 那么有且仅有一种方案填选,使得 S 为 C 的倍数, 即填上 SmodC 。
于是我们枚举钦定的位数 k, 设总的可以钦定的位数为 tot, 则这位填 0 的方案数为 2tot−k−1。
最后还剩下 M 本身所对应的唯一一个 M′, 把 MmodC 同样算出来看是否 ≤M 即可。
总结:每一步都很自然,但每一步都想不出来。
ARC085
A:小学数学。
B:对于这种博弈论的题, 要么是猜结论, 要么 SG 函数, 后者不会。
这先手肯定只留给后者不超过 1 张牌,好像挺显然,但又不显然。不会证明
C:最大权闭合子图模板题,其实是最小权,取个相反数就行了。
D:由于 a, b 都是 01 数组,而答案就是 n∑i=1[ai≠bi], 不妨枚举 a,b 是 0 是 1, 从而简化问题:
这时答案已经与 a 是否为 1 无关了, 我们只用把 ai=0 时转移 bi 即可, 思考状态转移:
把所有操作按左端点排序, 设 fi,j 表示考虑完前 i 个数, 目前从 i 开始最右覆盖到 j 的最小 ans, 若 i 没有被覆盖则为 fi,i−1,将每个区间给左端点,每次 fi,j→fi,r,j∈[l−1,r] 即可, 最后把 fi−1,i−1 转移给 fi,i+[bi=1]−[bi=0]。
ARC086
A:模拟。
B:发现若 a 全部非负, 取 a 的前缀和即可。 若 a 全部非正, 取 a 的后缀和即可。
否则我们考虑怎么把 a 变成上面两个形式, 容易发现我们都将 a 加上 a 中绝对值最大的数即可。
C:容易发现操作对每个深度独立, 于是我们只用考虑每一层的贡献即可。
设 fx,0/1 表示 x 为根的子树中, x 的权值为 0/1 的方案,转移的话若有一个儿子为 1, 其他为 0, 才有 1 的贡献, 否则都是 0, 对每一层建虚树 dp 即可。
D:不会。
AGC001
C:当直径长度 k 为偶数时,我们枚举中间点 x, 删去所有深度 >k2 的点。
为奇数时, 枚举中间边, 同理删去所有深度 >k2 的点。
D:人类智慧构造题。
首先我们可以转化成一个图论问题:对于一个回文区间 [l,r], 我们将 x 和 r+l−x 连边,表示他们是同一个值。 若最后的连通块大小为 1, 则说明所有点都是相同的。
还可发现, 若回文长度 l 为偶数, 会连出 l2 条边, 为奇数则会少一条,我们最后要连 n−1 条边使得变成一个连通块, 若 A,B 数组的奇数个数 >2 是肯定无解的, 设奇数个数为 cnt,我们构造的想法是让每一个回文内部先联通, 再留下一个点与后面的点拼接。
我们分三种情况:
若 cnt=0,直接让第一个点的 l−1, 最后加上一个 1。
若 cnt=1, 让奇数放在最前面,还是 第一个 l−1, 最后加上 1。
若 cnt=2, 让奇数放在首尾,第一个 l−1, 最后一个 l+1。
E:组合意义天地灭,代数推导保平安。
由于 a,b 的值域只有 2000, 我们以 bi 为下标开桶, 从大到小枚举 bi ,每次加入 (1+x),最后再平方一下就行。
F:考虑当 |pi−pj|=1 且 j−i≥k 的限制很不好做,我们考虑它的 "逆排列":即设 qi 表示权值为 i 的值所在的位置,那么限制就变成了相邻两个 qi,qi+1 交换, 而且 qi+1−qi≥k , 保证权值越小的数位置越靠前(注意这和字典序最小有区别),相当于翻转后的字典序尽可能大(具体可以参考[HNOI2015]菜肴制作) 的题解。
那么我们就可以类似冒泡排序一样贪心交换了,时间复杂度为 O(n2), 考虑优化。 提供两个思路:
- 继续找性质:容易发现若 j<i, 且 |pj−pi|<k, 那么 i 和 j 一定不可能被交换,也就是他们的相对顺序不会改变,我们考虑把这样的依赖关系建出一个 DAG,可以证明没有依赖关系的位置一定可以交换, 那么对这个 DAG 套用菜肴制作的方法(建反边,每次把最大的丢进优先队列,然后跑 toposort)。
直接暴力建边是 O(n2)的, 可以用线段树优化建图,但我们不用显式地建出图,考虑一个点 x 没有入度的条件是值在 (x−k,x+k) 的位置都在 x 前面, 删掉一个点 x 后, 有可能产生新的入度为 0 的点的条件为最靠近 x 的那个点, 于是直接线段树 + toposort 即可。 复杂度为 O(nlogn)
- 考虑直接用归并排序, 如果 j>i 且 pj<pi,我们试图将 j 放在 i 前面, 这要满足 i 到 mid 与 pj 的最小差 ≥k, 直接用一个 set 模拟即可,时间复杂度 O(nlog2n)。
ARC087
A:模拟。
B:容易发现 x 和 y 坐标互不影响,而且 同一个方向移动的距离对答案的贡献是一个 +- 号的关系, 于是直接背包即可, 用 bitset 优化。
C:SG 函数,不会。
D:考虑什么样的排列会使得权值最大:
相当于每一个 i 有一个匹配点 pi, 与其考虑每条路径的贡献, 不妨考虑每条边的贡献:
设边 (u,v),切掉这条边后得到两个连通块大小分别是 sizu,sizv,设 u,v 子树中分别有 x1/2,y1/2 个一类点, 二类点, 那么对答案的贡献是 min(x1,y1)+min(x2,y2),最优情况是 2min(sizu,sizv), 当且仅当 ∀x∈sizu,px∈sizv,而我们显然要答案的上界,也就是 ∀u,n−u≥u, 也就是 2u≤n ,这就是树的重心!
具体的,我们先把树的重心找出来(如果有两个,一个即可),那么对于重心 rt 的儿子 u, 必然有 n−sizu≥sizu, 对于一个 i 和 pi, 若 i 和 pi 在 rt 的两颗子树,那么一定能取到上界。
那么问题就转化成对于每个 i 设定一个 pi, 满足 i 和 pi 不在一颗子树的方案数。
考虑二项式反演, 不合法的状态一定是同一颗子树内互相匹配, 假设大小为 x 的子树内有 k 个点互相匹配,方案就是 (xk)2k! ,对于不同子树直接做个背包合并一下即可, 最后乘上 (n−x)! 后容斥即可。
ARC088
A:模拟。
B:差分后模拟。
C:若我们知道了每一个位置 i 最后的位置 pi, 那么最少交换次数就是逆序对个数,问题变为如何求解 pi。
首先若出现奇数次的个数 >1 显然无解, 其次,若两对匹配(i 和 n−i+1) 与另一对匹配相交,则显然不如完全包含,而交换两对已经匹配的字符显然不优,所以我们对于相同的字符,设它有 cnt 个, 位置分别是 p1,p2,…,pcnt, 则一定是 p1 匹配 pcnt, p2 匹配 pcnt−1…,依次类推,那么匹配之间的相对顺序是不会改变的,那么显然直接对一组匹配排序后依次分配标号即可。
D:题意描述有点奇怪,其实就是用 A 条长度不超过 B 的链覆盖整颗树,最小化 (A,B)。
显然 A 可以直接将儿子的链(无论多长)匹配,将每个点的度数除 2 向下取整即是 A 的最小值。
再考虑 B, 显然可以二分答案,然后...直接赛道修建那样贪心就行了,要使两条链拼起来 ≤K, 当然还可以直接对每个点考虑它保留下来的是哪条链,显然一个点留下来的链越短越好,然后这个还是有单调性...,反正随便做就行了。
ARC089
A:模拟。
B:观察到坐标可以对 2k 取模, 然后直接枚举分界点,利用二维前缀和即可 O(1) 计算。
C:又是人类智慧构造
观察到我们总可以把 S 到 T 的路径拆成若干个常数路径和几个 X 路径和几个 Y 路径,由于最短路长度不会超过 100, 于是拆成一个常数路径就行了。
根据上面的性质:我们考虑建出 S→1→2→⋯→101,其中所有边均为 X, 再建出 T←102←103⋯←202, 边均为 Y。
再考虑互相的连边, 假设 i→j 的边权为 fi,j, 那么若 X=x0,Y=Y0,此时要求 dx,y=min(fi,j+Xi+Yj) , 考虑将这个拆成不等式 dx,y≤fi,j+Xi+Yj, 那么就有 fi,j≥dx,y−Xi−Yj, 也就是 fi,j=max(dx,y−Xi−Yj)。
我们直接做上述操作,最后若能使所有 dx,y 取等则合法。
D:
Difflculy:3712
感觉比上面那个 3541 复杂多了....
由于最后算的是颜色序列而非操作序列,于是我们先研究在给定操作下,什么样的颜色序列是可以得到的。
首先把所有颜色相同的小球缩起来,若该连续段为白色,表示它在所有操作都没有被选到,最后再考虑。
此时还剩下两种连续段:全红的和含有蓝的。对于全红色显然一次染红色足矣,再考虑含有蓝色的:
我们再把这个含有蓝色的连续段缩一下,若开头是 B, 那么我们肯定要先染一个红色,我们就不妨在这个 B 前面加一个 R,对于结尾同理。因此我们只用考虑形如 RBRBRBR 的颜色序列能由什么样的染色序列得到即可。
显然第一次一定染 r,第二次一定染 b,对于第三次以后呢?那么无论选什么颜色,总的连续段个数都会 + 2, 那么假设这个序列含有 c 个 B,那么总长度为 2c+1, 那么经过前两次后长度变为 3, 简单计算可得最少的可以得到含有 c 个 B 序列的染色序列长度为 c+1,且前两个字符为 rb,其它随意。
那么我们归纳一下:假设分出来的杂色(由全红或红蓝颜色段构成的)段含有 x 个红蓝,含有的蓝色个数分别为 c1,c2…,cx, y 个红色,那么这样的染色序列能够被染出来当且仅当 S 能过拆分成 x+y 个子序列(不必每个字符都属于某个子序列,但每个字符最多属于一个子序列),而且 x 个都是以 rb 开头, 且长度为 ci+1。
此时我们发现,一个染色序列是否合法只跟它含有的 x,y 个数有关,我们可以直接在最外层枚举这个 x,y, 那么如果这个 x,y 合法,我们就简单的贪心一下:
先把所有 ci 从大往小排序(最后还原回去),记录此时 r 的个数 cntr 和 rb 的个数 cntrb,顺序遍历输入的操作序列 S, 若 si=r 且 cntr 没满,就给对应的连续段;若 si=b ,那么就把一对 rb 拼起来,设 endi 表示第 i 个 c 得到第一对 rb 的位置,对于可以自由分配的位置求一个后缀和记为 sumi。 那么一个颜色序列满足要求,当且仅当 ∀i,sumendi≥x∑j=i(cj−1)。
考虑根据 sum 和 x,y 进行 dp:由于 sum 是倒着枚举的,于是我们 dp 也要倒着 dp:设 dpi,j,k 表示当前计算到 i, i∼x 的 ci 已经确定了,现在 c=k, 且后缀 ∑=j 的方案数。
转移就枚举当前 c=j 的个数,就是一个二项加法卷积,有 dpi,j,k←∑lst∑cntdpi+cnt,j−(k−1)cnt,lst(x−i+1cnt) 。
可以通过前缀和优化至 O(n3lnn)。
最后考虑如何通过 dp 计算答案,枚举一个 i,j, 那么此时 x 个杂色连续段的位置已经确定了, y 个红色就直接组合数即可。考虑每个连续段中填球的方案数,我们考虑把颜色相同的连续段填入球,注意到此时有一些必须要填球的盒子和非必要填球的盒子。
先考虑白色:首先开头和末尾都可以放一个可以为空的盒子,对于 x+y 个杂色连续段而言,最开始是把它们隔开的,所以需要 x+y−1 个必须填的盒子。
再考虑红色:首先 y 个肯定是要填非空的,还有蓝色的 x∑i=1ci−1=i 个必须,然后对于所有蓝色连续段,每个开头和结尾都可以随便填可以空的,总共 2y 个。
最后为蓝色:由于我们得知 x∑i=1ci−1=i,那么 x∑i=1ci=i+x,这些显然又是要求非空的。
综上:可空集合有 2y+2 个, 要求非空集合为 (x+y−1)+(y+i)+(i+x),根据组合数计算即可。
总复杂度 O(n5lnn),根本跑不满。
ARC090
A:
B:
C:
D:
ARC091
A:
B:
C:我们把一个序列划分成 A 个长度 ≤B 的下降段,那么如果 A+B>n+1 或者 AB<n 则无解。
D:
ARC092
A:
B:考虑对于每一位算出含有这一位的总和, 设当前计算到 k 位,那么大于 k 的位是没有贡献的, 直接模掉,考虑两个数 a,b(a,b<2k+1) 相加什么时候第 k 位为 1:
当不进位时:满足 2k≤a+b<2k+1;进位时 a+b≥2k+1+2k,于是直接排序后计算即可。
C:有一个很显然的 O(n3) 区间 dp,但容易被卡。观察一下题目的限制,容易发现一定是全选奇数或偶数位置的数,那么直接排序贪心就行了,方案也很好输出。
D:先缩 SCC,分别 (u,v) 考虑连接不同分量和相同分量边:
- 连接不同分量:若删掉这个边, (u,v) 还有至少一条路径,也就是说 (u,v) 至少有两条路径, 反向后肯定会改变。
- 连接相同分量:那么没了 (u,v) u 就无法到达 v, 于是我们只用考虑删去 (u,v) 后 u 是否可达 v 即可, 对于一个点 x,删去与他相连的边可以用一个前缀拼一个后缀得到,于是直接 DFS 即可。
ARC093
A:
B:
C:首先求出一棵最小生成树,若边权总和 w>x 显然无解,若 w<x, 显然这些边都要染相同的颜色,否则已经是一颗最小生成树了,接下来考虑非树边:
设加入了 (u,v,w) 一条边,在原树上 (u,v) 的瓶颈是 w0, 则边权变化量为 w−w0, 设 Δ=x−w。
设 Δ=w−w0 的边有 cnt1 条, w−w0>Δ 有 cnt2 条,若 w−w0<Δ 显然只能和那些树边同色。
那么方案就是在 cnt1 条边中选出至少一条和树边不同,cnt2 条边可以任选, 为 2×(2cnt1−1)×2cnt2。
注意当 Δ=0,也就是 x 与最小生成树相同时,累加当前答案,为 (2n−1−2)×2m−n+1。
D:首先画几个图可以得知 1 在那个位置是不重要的,因为我们任意一种 1 的方案都可以互相转化,于是我们只用考虑 1 在起始位置的答案乘上 2n 即可。
考虑与 1 打的那些人,发现他们分别是 {p2},{p3,p4},…,{p2n−1+1,p2n} 这 n 个集合中的最小值,我们要求的是这些最小值中没有一个在给定的 A 中的, 考虑二项式反演, 求出钦定 k 个最小值在 A 里面的即可。
因为集合个数非常小, 考虑把一个集合中最小值是否在 A 中压缩成一个二进制,设 fi,S 表示当前考虑到第 i 个人, 目前已经被钦定为 A 中最小值的集合状态为 S 的方案数。
考虑每次新加入一个 A 中元素, 若 ai 不作为最小值直接 fi,S←fi−1,S 即可, 若 ai 作为最小值,那么还要选取一个集合,在加入一个比 ai 大的元素。
若此时按 a 从小到大加入,那么在选取比 ai 大的数时会算重, 考虑按 a 从大往小考虑,那么此时 a能选的就是 2n−ai−S 个数了,假设加入了大小为 k 的集合, 方案数就是 (2n−ai−Sk−1)k! , 最后没有加入集合的随便分配即可。
ARC094
A:
B:二分后 Hall 定理判定完美匹配, 注意边界问题。
C:首先特判 A=B。 考虑到若存在一个 ai>bi,那么第一个人可以一直保留这个 ai, 剩下全部删完后再花费 ai−bi 的次数。由于 A,B 不相等,i 一定存在, 对于所以情况取 max 即可。
D:将 a,b,c 分别看成 0,1,2, 那么操作是不会改变整个数组的和模 3 的。
还有一个基本猜不出来的结论:若 n>3, 那么最后变换得到的字符串,至少有一个相邻的字符相等(当给定字符不完全相等时),而且这是充要条件。 我不会证明, 我只会打表。
剩下的 case 的简单了,直接设 dpi,j,k,0/1 表示考虑到 i 位, 总和为 j, 第 i 位为 k, 之前是否有相邻相等的字符, 直接算即可。
ARC095
A:模拟。
B:贪心,一定选最大的和接近一半的数。
C:模 拟 退 火。
D:仍然考虑逆排列, 那么就是 pi 和 [1,i−1] 中最大的 pj 匹配。
那么有边相连的一定是前缀最大值,而且不同前缀最大值越多字典序一定越小。 那么就把树的直径找出来, 若一个不在直径上的点连向其他点显然无解,否则可以从左往右分配标号, 对于一个接了 k 个儿子的点, 把他的儿子标号为 i,i+1,…,i+k−1, 把这个点标号为 i+k。 然后从直径两端正倒做两遍即可。
ARC096
A:模拟。
B:模拟。
C:考虑二项式反演,计算钦定 k 个数出现次数 ≤1 的方案。若 n 个数中有 k 个集合, 可以看做没有在集合里面的元素都划分在一个特殊集合中,注意到可能没有元素在特殊集合中,需要加一个 0, 那么方案数就是 {n+1k+1} ,然后这些集合都能与剩下 2n−i 的集合拼起来后再与 22n−i 个子集族拼起来。 时间复杂度 O(n2)。
D:先把 apx≤ax≤apx+d 做差分, 就可以看做给每条边赋一个 [0,d] 的权值,一个点的花费是所有儿子的花费之和, 贡献是子树大小,然后做背包。
直接做背包复杂度为 O(nxd), 可以用二进制分组优化, 然而这远远不够。
考虑挖掘 n≤50 的性质:因为一个点选 1 次的贡献为 wx(wx≤n),想想我们最开始求解背包问题的贪心算法(按 vxwx 排序后选择)。
按照权值排序后,若 i<j, 且 i 还能选的次数 ≥50, j 已经选的个数 ≥50,显然我们可以让 i 多选 vj 次,让 j 少选 vi 次,此时总价值不变,但显然代价减少了,那么我们就对于每个数取出 min(d,n) 个做背包,此次由于总体积为 n×n×n=n3 级别, 于是我们考虑改一下 dp 状态:设 dpx 表示总收益为 x 所需要的的最小体积, 此时再用二进制分组可以做到 O(n4logn) 的复杂度。
做完 dp 后,剩下的元素一定是按照上述情况从大往小贪心选。
ARC097
A:由于第 k 小子串的长度必定 ≤k, 直接把所有 ≤k 的子串拉出来排序即可。
B: 直接把可以交换的位置并查集合并,在一个联通块里的点必然可以互相可达,最后看一下 pi 和 i 的联通性即可。
C:考虑 dp, 设 dpi,j 表示当前已经把 i 个 A 球和 j 个 B 球排序得到的最小代价,转移直接枚举当前加入 A 还是 B, 考虑增量,那么就是初始位置在当前球后面的个数,直接二维前缀和优化即可。
还可以分别设 swi,j,sbi,j 表示当前已经有 i 个白球, j 个黑球时加入一个 w / b 的增量,那么 swi,0,sb0,i 就是只有 w / b 球的增量。虽然 swi,j 不能由 swi−1,j 转移, 但我们考虑 swi,j−1, 那么 swi,j 在此基础上就是 posbj>poswi+1,直接 O(n2) dp 即可。
D:先把所有黑色叶子删掉,我们永远不会走到他们,那么此时剩下一堆白色叶子,那么由于每个叶子都要至少经过一次, 那么整颗树都会至少经过一次,那么最优情况一定是有一个起点 s 和终点 t, 从 s 到 t 的边都只经过一次, 剩下链上的子树都会绕一圈回来,也就是每条边经过两次,分别设 fx 和 gx 表示从 x 出发,走到 x 子树一个点为终点的最小花费;从 x 绕儿子走完的最小花费, 那么换根 dp 即可。
还可以不用换根,我们先计算每条边都走两边的答案,然后我们求出一条 Δ 最大的路径表示只经过一次的路径,对于每个点,若他度数为奇数且为黑色, 那么这个点作为路径上的点就减少了 2 的答案,对于度数为偶数且为白色同理,其它点没有改变。 然后求一遍直径即可。
ARC098
C:由于 n≤2000 直接枚举删除的最小元素,设为 x, 然后把 ≥x 的连续段进行一个一个不断的删,然后用小根堆把能删的第 q 小的数找出来即可。
可能出现 x 左右两边都没有数被删导致错误的情况吗?不存在,因为此时答案一定比选取删除的最小值要劣, 所以这是对的。
D:找性质:
Observation1:一个点最多捐献 1 次。 因为若捐献 ≥1 显然不如捐献 1 次。
Observation2:若重复经过一个点, 那么在最后一次经过这个点时捐献最优。因为若在前几次经过点 x 时捐献,剩下的钱会减少,有可能不足以经过其他点。
根据上面的性质,我们不妨设 cx=max(0,ax−bx), 表示到达 x 后至少拥有的钱数,捐献可以看做得到 bx 的钱。 那么我们显然想选一个 c 越小越好的联通块进行走。
一个简单的思路是按 c 从大往小排序后贪心走,但因为可能路径上存在一个 c 更大的点导致我们不得不增加初始钱数。于是我们想让这个瓶颈点越小越好。
两点之间点权最大的越小?Kruksal 重构树!考虑建出 Kruskal 重构树后, u,v 的瓶颈是 lca(u,v) 的 c, 考虑 dp, 设 dpx 表示从 x 子树中的一个点开始走, 走到 x 的最小初始花费, 那么最终答案就是 dprt+sumrt, 其中 sumrt 表示 rt 子树中所有 b 之和。
考虑转移:根据上面的推论,因为一个点只有最后经过他时加上贡献最优,那么假设 u 有 k 个儿子, 就是先走 k−1 个儿子,然后加入自身贡献,然后走最后一个儿子, 即 dpu=min(max(dpv,cu−sumv)),其中 cu−sumv 表示走到 u 至少要 cu, 在 v 已经得到了 sumv。
ARC099
C:完全子图就是一个团, 团显然不可做, 考虑转化为最大独立集。
那么问题就是选出两个集合, 要求集合内部之间没有边相连,假设一个集合有 x 个点,最小化 m−(x2)−(n−x2)。
选出两个点集, 点集之间没有边相连...这不就是黑白染色后的二分图吗?于是原图不是二分图显然无解。
若有解, 显然我们想让 x 越接近 n2 越好。 考虑到把边全部取反后可能有多个联通块,我们考虑暴力一点的做法:直接 bitset!复杂度 O(n3w)。
D:
ARC100
A:
B:
C:高维前缀和模板题。
D:考虑补集转化,含有 A 数组的不一定含有长度为 k 的连续段个数显然为 (n−m+1)kn−m, 再考虑减去含有 A 的不含长度为 k 的连续段。
考虑分类讨论 A 中的元素:若 A 本来就含有长度为 k 的连续段,显然后面一部分为 0。
若 A 不含有长度为 k 的连续段,且 A 含有重复元素,那么一个合法的连续段一定不会经过 A, 设 A 前缀 / 后缀最长连续段长度分别为 l1,l2。考虑 dp :设 fn,k 表示长度为 n 的序列,目前最长连续段长度为 k 的方案,考虑转移。
注意到我们并不关系连续段出现了什么数, 那么若长度为 l 的连续段, 后面拼 l 中任意一个元素,都能构成长度为 1,2,…l 的连续段,若不拼, 有 k−l 中方案使连续段 + 1, 后缀和优化即可 O(nk), 最后赋初值就是 f0,l1=1, 对左边和右边分别做一次即可,然后卷积拼起来。
若 A 没有重复元素, 同理考虑上面的 dp, 我们计算出所有长度为m 的排列的贡献, 然后除以 km_ 即可。 只不过我们还要额外记录 A 出现的次数, 那么设 gn,k 表示长度为 n 的排列, 最长连续段为 k 时, 长度为 m 的排列出现次数之和, 转移类似。
ARC101
A:
B:二分中位数 x, 把 <x 的设为 1, ≥x 设为 −1, 那么就是多少个子区间之和 ≥0, 树状数组即可。
C:考虑 O(n3) dp:设 fx,k 表示 x 子树内还有 k 个未匹配点,且未覆盖的边只在未匹配点到 x 的路径上的方案, 转移直接枚举 x,y 的未匹配点个数, 再枚举匹配几个即可。
考虑优化, 由于每条边都要有颜色,考虑钦定边集后容斥,此时要保证删去边集后每个连通块大小都为偶数(这样才能匹配),方案数 g(n)=1×3⋯×(n−1), 于是最后的答案可以写成 (−1)k(g(s1)×g(s2)⋯×g(sn−k)) 。
设 fx,k 表示 x 的连通块大小为 k 时容斥系数之和,转移直接考虑 (x,y) 的边删不删,可以做到 O(n2)。
D:以下将 bot 看成球, exit 看做洞。
容易发现在最左边球左边和最右球右边的球一定没有贡献。
对于夹在位置在 [L,R] 中间的球,若一个球从右边出去,那么再它右边的球显然也是从右边出去。
设 li,ri 表示第 i 个球离他最近的左边洞的距离, 右边的距离,设一个数组 ai=0 表示 i 从左边,1 表示从右边,那么上面的条件可以写成若 li≤lj,ri≥rj, 若 ai=1, 那么 aj=1,容易?发现这是充要条件。
将所有点按 li 排序,我们考虑未被限制而自主选 1 的点拎出来,容易发现这构成了一个上升子序列。
直接 dp 即可, 用树状数组优化。
注意统计空序列。
ARC102
D:考虑当 L=2k 怎么做:这要求 1 到 n 恰好有 L 条路径,且路径长度的并为 [0,2L) 。 我们考虑如下构造: i→i+1连 0 和 2i−1 的边,那么当终点为 n 时就有 2n−1 条路径。
当 L≠2k 时,考虑 L 的最高位 ,设为 r, 我们先把 [0,2r) 用 r+1 个点表示出来。从高到低考虑 L 的非最高位 1,假设当前考虑到 p 位 , 类似数位 dp 的思想,我们把当 p 位为 0, 低位任选表示出来,即 [l,l+2p−1), 其中 l 为高于p 位的二进制和,可以看做 l+[0,2p) , 于是直接向 p+1→r+1 连 l 的边权即可。
设 n=logL ,则总点数为 O(n), 边数为 O(3n),可以通过。
E:考虑对每一个m∈[2,2k] 分别计算。
当固定总和为 m 时, 会出现 i 和 m−i 匹配,于是要求 i 和 m−i 不能同时选,设这样的匹配有 cnt 个,我们枚举在这 cnt 对中选择的个数,可以得到:ans=cnt∑i=0(cnti)2i(n+rem−1cnt+rem−1), 其中 rem 是没有匹配的个数。
当 2∣m 时,会出现 m2 自己和自己匹配的情况,枚举一下选多少个即可。
F:神必充要条件。
首先可以观察出来的是我们贪心将小的移动到前面一定是最优的,于是我们可以暴力交换,一个位置 q 要换到 p 的条件为 2∣|p−q| 且对于 i∈(p,q), 相邻的 bi<bi+1, 不好直接用数据结构维护。
结论 1:被操作的点仅可能是初始序列中 pi=i 的点。
证明:分两种情况考虑:一种是本来就表示 pi=i 的点;另一种是 在若干次交换后 pi=i 的点。操作完后 pi−1<pi<pi+1
case 1:若 pi<i,则最后要把 pi 移到左边去,那么我们一定要对 i−1 作为中心操作,而 pi−1<pi,我们又要以 i−2 为中心做一次使得 pi−1>pi, 而此时 i−2 不满足..以此类推,终会在有限步内无法操作。对于 pi>i 的情况同理。
case 2:此时这个点只有可能与 pi−2 和 pi+2 交换得来。若从 pi−2 交换得来则有 pi>pi−1, 否则 pi<pi+1 ,显然 pi=i 的点是不能再换的了,于是 i 也无法交换。
有了这个结论,新建一个数组 bi=(ai==i), 对于 bi 相同的值无法交换,于是我们会得到若干个 01 交替的连续段,每一次可以移动 相邻两个 0, 问最后是否能升序排列。
结论二:若除去 bi=1 的元素后,剩下部分最长下降子序列 ≥3 则无解。
证明也很简单,随便画一下就知道对于 x<y<z, 若 px>py>pz, 一定存在一个交换点使得 x,y,z 其中两个无法交换。
时间复杂度 O(n) 。难点可能在于一个结论都想不到 /ll
ARC103
D:由于 log1012≈40,所以多半这个 40 个操作序列和二进制有关。我们不妨考虑当 c=1,2,…,2k 时,可能得到的坐标会是什么样子。
当移动的距离的奇偶性不同时显然无解。
容易发现,当 c=1,2,…,2k 时,能够到达的区域形成了一个菱形(也就是曼哈顿距离不超过 2k+1−1,而且 |x+y| 为奇数的坐标) 的区域,若要求为偶数补一个 1 即可。
于是做法就很显然了,我们直接把 1,…,240 作为移动距离,从大往小贪心,每次将坐标绝对值更大的加上 / 减去 2k, 可以用数学归纳法证明这是对的。
E:显然若 s1=0∨sn=1 无解,若 si 与 sn−i 不同,无解。
考虑构造几条切边,具体来说,记录一个 lst 表示上一个连边的点,连边 lst,i+1,若 si=1 ,我们就把左边的点切掉,直接将 lst=i+1 即可。
F:首先一个点到所有点的距离之和可以换根 dp 求得:若 y 是 x 的儿子,有 fy=fx+n−2×sizy。
容易发现 f 最小的一定是重心,由于 f 互不相同,重心唯一,而且重心到一个叶子之间的路径的 f 一定单调递增。我们把 f 从大往小考虑,对于一个点,我们只要知道 sizy 就能唯一确定它的父亲,容易发现从大往小遍历一定能让所有儿子先遍历后父亲遍历,最后判断一下根节点是否合法即可。
ARC104
D:枚举 x , 把数字 k 设为 k−x, 最后就是背包后总和为 0 的个数。把 ≤x 和 >x 的分别维护,发现就是个前缀背包,直接 O(n4) 预处理,O(n4) 回答即可。
E:发现 n 小得离谱,直接考虑枚举相对大小关系 66 然后计算方案数。
把相同的数合并一下,就成了每个位置可以选 ≤ax 的,问最后单调递增的方案。离散化后设 fx,i 表示考虑到 x,ax 位于离散化后的第 i 段值域(区间左闭右开),转移直接枚举 x 之前能有多少个数能和 x 在同一个区间,组合数算一算就好,O(n3)。
F:
ARC105
E:不是那么套路的博弈。
考虑到最后的局面一定是剩下两个连通块,分别是 1 和 n, 而且都是一个团,当我们知道最后 1 和 n 的连通块大小后,我们可以计算出可以连的边的个数为 n(n−1)2−c×(n−c)−m。
容易发现,当 n 为奇数时 c(n−c) 必为偶数,于是整个式子奇偶性确定。
当 n 为偶数时,设最后的连通块 1 和 n 的大小分别为 s1,s2。
- 当 s1,s2 不同奇偶时,剩下的奇数连通块有奇数个,若先手想要两个奇数,可以将一个偶的变成奇的然后根据后手选择选择。当先手想要偶数时同理。 故这种局面先手必胜。
- 当 s1,s2 同奇偶时,剩下偶数个奇数连通块,同样的分析可得当 s1,s2 为奇数时想要奇数的人获胜,都为偶数时想要偶数的人获胜。
F:连通二分图不好计算,考虑容斥。
设 fS 表示点集为 S 的二分图方案,gS 为点集为 S 的连通二分图方案,f 是好求的,枚举一个子集后与它的补集中的边可以任意选择。
考虑计算 g ,按照【城市规划】的思路,我们钦定一个点,包含这个点的点集连通,其他任选,容斥一下即可。
最后由于左部点和右部点会计算两次所以答案除以 2。
ARC107
D:奇妙 dp。考虑设 dpn,k 表示 n 个数和为 k 的方案数,怎么转移呢?
类似拆分数的思想,要么新加一个 1, 要么把所有数除以 2,容易?发现这样操作可以表示任意一个集合。 故 dpn,k←dpn−1,k−1+dpn,k×2。
E:打表发现从第 6 行开始,每条对角线的值开始相等,直接暴力。
ARC108
D:分类讨论。
首先考虑 cAB 的取值,只考虑 cAB=B 的情况,对于 cAB=A 的情况同理。
当 cAB=B 时第一次操作变成 abb, 若 cBB=B 显然只有一种情况;若 cBB=A , 再考虑 cBA 的情况。
当 cBA=A 时容易发现除了 s1=A,s2=B,sn=B 这 3 个位置不能填其他的,其他任意填,于是方案就是 2n−3。
当 cBA=B 时,不会出现两个 A 相邻的情况,设 fi 表示当最开始为 B 时的方案,有 fi=fi−1+fi−2 ,答案就是 fn−2。
E: n≤2000 果断考虑区间 dp,设 fl,r 表示只考虑 [l,r] 中的元素,其中 l,r 强制选的期望,最开始把 a0=−∞, an+1=+∞, 答案就是 f0,n+1。
转移直接找到满足 al<ak<ar 的 k 的个数,设为 cnt 个,则 fl,r←1cnt(∑kfl,k+fk,r)+1。
直接 dp 是 O(n3), 用树状数组维护一下 fl,k 和 fk,r 即可。
F:【11.06模拟】黑白树
跟树上最长路径有关问题,先考虑求出直径。那么一个点到它同色的最长距离一定有一端在直径端点上。
当端点同色时答案显然为 len×2n−1, 接下来考虑端点不同色的答案。
直接计算直径长度 =k 的不好计算,考虑计算直径长度 ≥k 的答案。
对于每一个 i 计算出它到两个直径端点的距离 d1,d2 ,那么它对整个直径的贡献至少为 min(d1,d2), 我们把最小的答案 v=max(minid1i,d2i) 求出来,那么当 k≤v 时随便选直径都 ≥k, 对答案的贡献为 v×2n−1。
当 k>v 时,那些存在一个 di>k 点任选一个就好了,设 max(d1,d2)≥k 的点有 cnt 个,对答案的贡献为 2×(2cnt−1)×2n−2−cnt。
ARC109
D:
E:首先这种博弈还要计数的,博弈的结论一定很简单。
容易发现在移动的过程中不会出现黑白交替的情况,最后一定是存在一条分界线,使得分界线左边和右边颜色不同。
如果两端的颜色相同,显然整个序列都是这个颜色。如果不同,显然双方一定是朝着与自己颜色相同的位置一直走去,假设前缀连续段为黑色,长度为 l, 后缀白色连续段长度为 r, 当前所在位置为 p, 若 p−l≤r−p, 显然先手会先走到自己的区域,使得 [1,r) 全部变成黑色,当 p−l>r−p 同理。于是可以枚举 l,r,p, (l,r) 的位置的值可以随便选,时间复杂度 O(n3)。
但是我们发现没必要枚举,因为前缀为黑色的情况会和前缀为白色的情况拼成长度为 n 的总序列。总方案为 2n−1×n, 但有个特例是 p−l=r−p, 也就是开头到两端的距离相等,此时会额外加上 (r−l−1) 的贡献,直接枚举这种特殊情况并加上即可。
ARC110
D:
一个 Ai 的生成函数显然为 xai(1−x)ai+1, 设 S=∑a, 把所有 a 乘起来就是 xS(1−x)S+n, m 次项系数为 (m+n−1S+n−1) 。
ans=m∑i=0(i+n−1S+n−1)=(m+nS+n)
E:把 a 看做 1,b 看做 2,c 看做 3, 那么一次操作就是把相邻两个数异或一起来,因此总的异或和不会改变,那么最后得到的字符串可以看做把原来字符串划分成若干个段,每一段的异或不为 0。
考虑 dp, 设 dpi 表示前 i 个数的划分方案,转移直接枚举 j<i 而且 sj−1xorsi≠0 转移。哎等等,这样会导致一段异或和为 0 的段被划分到不同集合,但它不会造成影响,一个简单的例子就是 abba 。
怎么才能不算重?维护一个 nxti,j 表示在第 i 个数后面第一个异或和为 j 的位置。转移只转移第一个位置即可,由于最后一段的异或为 0, 没有转移。 若 si+1,n 异或和为 0 则累计 fi。
F:我们先把序列还原成 n−1,n−2,…,0 倒序的形式,这只要我们从右往左,若 pi≠i,无脑交换即可,容易证明后面的交换不会影响到前面的交换,而且不会出现循环的情况。
倒序排列之后,我们再从大往小还原,具体来说,我们每次都以 1 为中间变量,先把 n−1 还原过后每次把 1 放到最后面然后依次和 n−2,n−3 交换,因为每次和 1 交换后没有 sorted 的元素依然是倒序的,所以不会影响到。
操作次数为 O(n2)。
ARC111
D:若一条边的相连的 cx,cy 不相等,显然是大的连向小的,对于 ci 相等的情况,我们直接让他们再一个强连通分量即可。直接 DFS 把非树边反向即可。
E:容易发现能有贡献的 i 不会超过 v=⌊D−1C−B⌋, 因此这些区间最多有一个满足条件,答案就是:
ans=v−v∑i=1⌊A+CiD⌋−⌊A+Bi−1D⌋, 套类欧板子即可。
F:权值 = 总方案 × 期望,考虑求出 E(t) 表示一个点经过 t 次取 min/max 操作后的期望(一定包含),设 P(t,i) 表示一个点经过 t 次后变为 i 的概率,显然有 E(t)=m−1∑i=0i⋅P(t,i)。
对于 P(t,i),我们有递推式 :P(t,i)=P(t−1,i)×m+m−1∑j=0P(t−1,j)2m=P(t−1,i)×m+12m=P(t−1,i)2+12m。
对于初始有 P(0,0)=1, 展开后发现是个等比数列的形式,于是可以得到 P(t,i)=1m−12tm。
带入可得 E(t)=m−1∑i=0i⋅1m(1−12t)=m−12(1−12t)。
设 h(t,i) 表示 i 位置 t 次操作后的期望(都没有询问操作),设 pi=i⋅(n−i+1)(n+12),有 h(t,i)=t∑j=0(tj)pji(1−pi)t−jE(j)=m−12[1−(1−pi2)t]。
设 g(t,i) 表示 i 位置 t 次操作的期望(有询问操作),注意此时概率变了,要重新求一次期望:
g(t,i)=t∑j=0(tj)hj,i(2m)j(2m+1)t, 设 Pi=1−pi2,化简后得到 g(t,i)=m−12[1−(2Pm+12m+1)t]。
最后考虑求答案,设 fi 表示 i 位置的期望,有:
fi=pi2m+1q−1∑j=0gj,i=pi(m−1)4m+2[q−S(2Pm+12m+1,q−1)] 。其中 S(x,n)=1−xn+11−x。
时间复杂度 O(nlogn)。
ARC112
C:设 fx,0/1 表示在 x 子树,先手 / 后手所得的最大收益。
对于一个儿子 y, 若 sizy 为偶数,从 y 出来时不会改变先后手,否则会改变。
若 siz 为偶数且 fy,0<fy,1, 则后手一定走这条边使自己更优,否则先存起来,设 sum1=∑fy,0,sum2=∑fy,1
若 siz 为奇数我们能算出最后到达 x 的先后手,然后累加 sum1,sum2,然后将所有点按照 fy,1−fy,0 从大到小排序后依次累加,意思是选择这条边的人会尽量使得后手收益更大,然后模拟即可。
时间复杂度 O(nlogn)。
D:若存在 (x,y) 的 #, 表明 x 行和 y 列可以互相到达,可以互相到达是一个等价关系,那我们就用并查集把他们合并起来。
合并完之后,我们容易发现一定存在一种最优方案使得只在行添加 # 或者只在列添加 #,然后模拟一下即可。
E:首先把题目要求反过来,变成把给定 a 变成 1,2,…n 的方案数,每次把一个首尾放进一个位置。
对于一个数而言,显然我们只需要保存对它的最后一次操作。
观察发现不会被操作的数为 a 中的一段上升子序列(可能为空),于是我们枚举这个区间 [l,r], 那么就是 [1,l) 的数要依次插进 [l,r], (r,n] 的数也是依次插进 [l,r] (方案均唯一),发现填的是有顺序的,考虑 dp:设 dpt,i,j 表示在确定 [l,r] ,经过 t 次操作后,目前前缀已经填了 i 个,后缀已经填的 j 个的方案 ,转移考虑枚举 l+1,r−1 这个数填不填,可以得到:
dpt+1,l+1,r←dpt,l,r,dpt+1,l,r+1←dpt,l,r,dpt+1,l,r←dpt,l,r×2×(l−i+r−j) ,答案就是 dpm,l−1,r+1
换个方向 dp:设 dpt,i,j 表示剩余 i 个前缀和 j 个后缀的方案,则有 dpt+1,l,r←dpt,l,r×2×(l+r), 设 l+r=v, 则有 dpt+1,v+1←dpt,v,dpt+1,v←dpt,v×2×v。
枚举最终的决策中几次选择了 l,可得最后的 dpl,r=(l+rl)dp′t,l+r
注意统计空序列,此时 l+r=n。
时间复杂度 O(n2)。
ARC113
D:枚举 a 中最大值 p,方案数为 pn−(p−1)n,此时 b 中所有元素应该 ≥p, 方案为 (k−p+1)m,但当 n=1∨m=1 时不能满足条件,需要特判。
E:
F:
ARC114
C:首先考虑给定一个序列 A 如何求解 f(A):把 A 中元素从小到大排序后。第一次一定选整个区间,第二次要在若干个 1 之间选择..依次类推,设当前考虑到 k, ≤k−1 形成的分割段将 =k 划分成 p 段,则需要放 p 次。
对每一个 k 分开考虑计算贡献即可。
D:区间取反想到异或,设红色为 0, 蓝色为 1, 则相当于初始在 t1,t2,…,tk 打上 1 的标记,对于每一个 piece,也在初始位置打上 1 的标记,然后选择一个位置(可以是自身)打上 1 的标记。
每个 piece 可以和标匹配也可以和另一个 piece 匹配。因此把所有含有标记 1 的位置找出来,设为 m 个,若 m>n∨2∤(n−m) 显然无解,否则我们发现,若将 piece 和空位排序后,一定是 piece 和空位一一匹配,也就是说不会出现交叉匹配的情况。
设 dpi,j 表示前 i 个 pieces 和前 j 个空位匹配的方案数,则有 fi,j←min(fi−1,j−1+|ai−bj|,fi−2,j+ai−ai−1)。
E:每次删去一行一列后分母会改变,若想知道当前剩下几行几列只能高维 dp。考虑优化。
先考虑一维情况,拓展到二维是容易的。如果你做过 PKUWC2018 猎人杀的话,接下来的转化就不那么神仙了:我们不考虑分母,而是每次等概率选择,只有在 当前合法(不合法情况包括:当前所在纸条已经和黑色分离,两个黑色已经分离)才操作,求操作的期望。
证明是很简单的,假设已经切到了某个状态,下一步合法的状态的概率是相等的,等于合法个数 cnt 的 1cnt。
然后只用考虑每个切线的贡献了,设黑色位置分别在 x,y,分几种情况考虑:
- 若 i<x, 则 i 是 i∼y 中第一个被切的,概率为 1y−i+1
- 若 x≤i≤y, 则 i 是 x∼y 中第一个被切的,概率为 1y−x+1
- 若 i>y 同理。
拓展到二维无非就是分母多加了另一维的情况,直接计算。
时间复杂度 O(n+m)。
ARC115
C:显然所有 i 的因数会和 i 有边,答案就是有最多因数的数。
D:对每个连通块分别考虑,最后卷起来即可。
显然 i 为奇数时无解。当 i 为偶数时,对于一个点集而言,方案数是多少?
似乎不是很好做,先考虑树的情况:设选出来的点集为 S, 任选 S 中的一个点为根建出 S 的虚树,首先叶子节点一定是奇数度数。
对于 lca 而言,它只能根据其儿子的个数决定其向不向父亲连边,若儿子有偶数个不能连边,否则连向其虚树上的父亲。
由于总个数为偶数个,根节点一定是奇数度数,因此对于一棵树而言,每一个点集都有唯一合法的方案。
对于图,先随便求出一棵生成树,加入若干条非树边后相当于强制取反了某些点的状态,这些点仍然会形成一棵虚树,因此所有的非树边集和点集都能配对后形成唯一合法方案。设一个连通块内共有 m 条边, n 个点。则选出 k 个点合法的方案为 (nk)2m−n+1 ,把所有连通块卷起来即可。
E:显然容斥,钦定 k 个相邻位置相同,系数就是 (−1)k。然后随便用线段树维护一下区间乘积就好了。
F:先套二分。设初始状态为 S=(a1,a2,…,am),终止状态为 T=(b1,b2,…,bm)。直接考虑 S→T 的转移似乎有点困难,能不能把 S,T 都归结成一个状态?
考虑如下的等价关系:设 V(S)=m∑i=1aSi,每次选择一个 Si 换成其他节点,满足每次的 V(S) 都合法,对于两个状态 S,T 而言,他们可以互相到达当且仅当他们处在同一个等价类 ⇔ S,T 所能到达的最小状态相等。
于是可以开始贪心,预处理出每个点往外面跳代价最小的点 y,且满足 ay<ax。每次只用贪心跳,最后判断两个状态是否相等即可。
ARC116
C:显然随便 dp 乘上组合数即可。
D:[SDOI2011]黑白棋 弱化版。
E:二分答案后树形 dp。
F:结论题。
通过打表可以发现,一个序列的答案只和序列长度有关。
若长度为奇数,先手先取,答案为 min(amid,max(amid−1,amid+1)),否则答案为 max(amid,min(amid−1,amid+1)) 。
若长度为偶数,先手先取,答案为 max(am1,am2),否则答案为 min(am1,am2)。
得到推论:
- 若序列长度为偶数,则每个人都希望自己是先手。
- 若序列长度为奇数,则每个人都希望自己是后手。
于是,二人应该先把长度为偶数的序列抢完后,剩下那个人开始取奇数序列,又因为取完奇数序列后先后手顺序不会改变,于是一定是剩下那个人取完所有的奇数序列。
而对于偶数序列的选择先后,按照取走首 \ 尾后的极差从大到小排序后选取即可。
ARC117
C:按照经典套路,R = 0, G = 1, B = 2,那么两个格子的上面一个为 −(Ai+Aj),每一个底层格子对答案的贡献为 (n−1i)(−1)n−1Ai,lucas 即可。
D:题目要求 ∀i,j,|Ei−Ej|≥dist(i,j),那就把绝对值拆开,将 Ei 从小到大排序后,满足 Eaj−Eai≥dis(ai,aj),将相邻的不等式合并后有 Eai+2−Eai≥dis(ai+2,ai+1)+dis(ai+1,ai)≥dis(ai+2,ai)。
于是只要满足相邻两个,所有的点对都能满足。
显然可以观察到的一点是,把大于号改为等号显然更优。于是问题变成从一个初始点 rt 出发访问所有点,最小化相邻两点的距离。
根据虚树的推论,显然其等于 2(n−1)−dis(p1,pn)。
显然,取 p1,pn 为直径端点,答案最小,构造只用把欧拉环游序输出即可。
E:取其前缀和数组,问题变成长度为 2n+1 的序列,满足 a1=0,a2n+1=0,|ai−ai−1|=1,∀2≤i≤2n+1,答案是 ∑i(cnti2)
不妨假设 ai≥0,考虑对于每个 i 直接枚举 cnti,从高到低枚举,设计 dp 状态为 dpi,j,k 表示当前从高位枚举到低位,目前的个数为 i,∑i(cnti2) 为 j,且相邻两个的空位总数为 k 的方案(空位是指,需要在这两个位置中间加入一个 x−1)。
若当前有 k 个空位,加入 c 个数,方案为方程 x1+x2+…xk+2=c 的正整数解个数,为 (c−1k+1),转移 dpi+c,j+gc,c−k−2←dpi,j,k×(c−1k+1)。 时间复杂度 O(n5)。
最后考虑加上 ai<0 的情况,只用把剩下的 k 个空位补上,答案就是 ∑i∑j∑kdpi,j,k×dp2n+1−i,K−j,k−1。
F:
ARC118
D:设 a 能生成的集合为 <a>,b 作用于 <a> 会得到一个 n×m 的网格。其中两两元素互不相等,第 i 行 j 列的元素为 aibj。其中 n=ind a,m=ind b,若 nm≠mod−1 显然无解。
否则 n,m 一定一奇一偶。不妨假设 n 为偶数,那么一个构造是先走第一行,然后反复横跳,最后从最后一行第一列走回去。
E:考虑钦定走 k 个 −1 障碍容斥。设 dpi,j,k,0/1,0/1 表示当前在 (i,j),目前已经钦定了 k 个 -1,当前行 / 列是否存在被钦定的数。转移是显然的。最后剩下 rem−i 个没钦定的乘个组合数就好。
F:容易发现,非零的 Ai 只有 logM 个。从后往前 dp,设 dpi,j 表示从后往前考虑到 i ,取值是 j 的方案,转移 dpi,j=∑v≥ai×jdpi+1,v。
发现是个后缀和形式,维护其前缀和点值序列,于是 dpi,j=fi+1(M)−fi+1(ai×j−1)。
当 ai=1 时直接根据 fi+1 算就好了。否则需要对于每一个点值进行计算,多项式次数是 O(n) 的,计算 复杂度就是 O(n2logn)。
ARC119
D:将 n×m 的网格看做二分图,对于一个红色点 (x,y),将左侧的 x 和右侧的 y 连边。
那么一次操作可以表示为选择一个度数非零的点,删去其连向的所有边。
设最后删去了 a 个左部点, b 个右部点,答案就是 nm−(n−a)(m−b)。
对于每个连通块分别考虑,显然可以取其任意生成树,从叶子开始删点直到留下根,由于根是任意选择的,那么只用贪心地使得 nm−(n−cnt+c)(m−cnt−m−c) 最小即可。
E:翻转 [l,r] 对答案的变化为 |al−1−ar|+|ar+1−al|−|al−1−al|−|ar−ar+1|(忽略 l=1,r=n 的情况),后面对于 l,r 独立,对于 al−1,al,ar,ar+1 四者的大小分类讨论后二维数点。
F:
ARC131
C:显然当 n 为奇数时先手必胜,否则若存在一个数等于全局异或和先手必胜。
D:显然确定了起点后一定是每次走 D 最优,至少有一个点落在 [0,D] 的有 ⌈n2⌉ 个,<0 的有 ⌊n2⌋ 个,设 fi 表示起点为 i 的收益,先求出 f0 后,fn 相对 fn−1 的变化是那些端点 modD=n−1 的所有区间,且每个区间至多变一次,于是也可以 O(n) 计算。
E:设 d=n(n−1)2,当 d 不是 3 的倍数无解。否则一定存在一种方案使得相同点连出的边颜色相同,等价于将 {1,2,…,n−1} 划分成 3 个集合使得和相同,当 n=6 时 {1,4},{2,3},{5},n=7 时 1,6,2,5,3,4,9≤n≤11 同理可以贪心构造,当 n≥12 时可以将最后 6 个两两分组,递归到 n−6 的子问题。
时间复杂度 O(n)。
F:
ARC135
删除一次后的序列形如 2,3,5,6,8,9,…。设 f(i) 表示第 i 个位置的数是多少,容易观察得到 f(i)=⌊3i+12⌋ ,于是删除 k 次的就是 fk(i)。
设 h(n) 表示长度为 n 的序列删除一次后的长度,容易得到 h(n)=⌊2n3⌋,于是当 k>80 时一定被删空了。
当 k>40 时,最后剩下的数很少,可以直接用 f 算出来。
否则,首先说明一个引理:
∀k>0,fk(n+2k)=fk(n)+3k。
Proof:当 k=1 显然成立。对于 k>1 采用归纳法:
将 k 拆成高位和低位设为 X,Y,将 i(1≤i≤n) 表示成 ai+b,(a=2X,b<a)。枚举 b,则一个 b 对应的答案为:
(n−b)/a∑i=0fk(ai+b)=fY(fX(ai+b))=fY(fX(b)+3Xi)。
再讲 (n−b)/a 二进制拆分为若干个长度为 2k 的区间,一个区间 [l,l+2k−1] 的答案为:
l+2k−1∑i=lfY(fX(b)+3Xi)=2k−1∑i=0fY(fX(b)+3Xi+3X2k)
设 g(a,k)=2k−1∑i=0fY(fX(a+3Xi)),上面等价于 g(3X2k+fX(b),k) 。
而同理可得 g(a,k)=g(a,k−1)+g(a+2k−13X,k−1)。
当 a≥2k 时:设 a=2ku+v,g(a,k)=2k−1∑i=0fY(fX(2ku+v+3Xi))=fY(fX(v+3Xi)+3ku),因此可以保证 a<2k,k<X≤20,计算一个 g(a,k) 的时间为 O(k)。
一共有 2X 个 b,每个 b 拆成了 logV 个区间,因此总时间复杂度为 O(2XXlogV)。 当 k≤40 时采取该算法即可。
ARC137
C:当 an−1+1<an 时,先手将 an←an−1,若该状态是必败态结束,否则
ARC138
D:当 k=1 时是经典格雷码问题,设 Gi 表示格雷码第 i 位,有结论 Gi=i xor⌊i2⌋,还有若干构造做法,最直观的一种是分治,计算 solve(s,t,d) 表示始末点为 s,t,大小为 2d 的格雷码。当 t 第 d−1 位为 1 时先找另外一个点 x<2d−1,递归 solve(s,x,d−1),再递归 solve(x|2d−1,t,d−1);否则 s,t 第 d−1 位都是 0,先递归 solve(s,t,d−1),找到第 1,2 个点 x,y,将 x→y 变成 x→x′→y′→y。
当 k≠1 时不是很好用构造来描述,考虑其差分显然要满足 popcount(di)=k 且任意区间的差分异或 ≠0,因此将所有 popcount(d)=k 的点加入一个线性基内,将二进制的每一位变成线性基的第 i 位,容易发现这样一定满足条件。
时间复杂度 O(2n)。
E:
F:考虑 dp,设 dpl,r,d,u 表示考虑所有 l≤i≤r,d≤pi≤u 的点的合法排列方案,显然不能简单地枚举分割点和维度直接加起来算,会算重。可以处理算重的方式要么是直接根据最后排列来计算,要么钦定字典序最小转移。此题是不好直接得到最后的排列的,因此考虑钦定字典序最小转移。
设 x(i) 表示执行 x=i 的操作, y(i) 同理,钦定操作的字典序大小为 x(1)<y(1)<x(2)<y(2)⋯<x(k)<y(k)。
假设第一次选择 x(i),递归到右侧的操作是没有影响的,有影响的是递归左侧的操作且先执行这些操作再执行 x(i) 和先执行 x(i) 得到的排列相同。
考虑容斥,任意选的方案是 dpl,i−1,d,u,需要减去字典序比 x(i) 小(即所有 j<i 的 x(j) 和 y(j))的方案,设 fi 表示第一次选择了 x(i) 且字典序最小的方案,gi 同理,对于 x(j) 则有 fi=dpl,i−1,d,u−∑j<ifjdpj,i−1,d,u。
对于 y(j),若执行 y(j)+x(i) 和执行 x(i)+y(j) 相同,手推一下即可发现要求是对于所有 pk≤j 的点, k≤i,减去 gkdpi,r,l,k−1。
对于 g 的转移同理,于是 O(n6)。
ARC139
B:首先将 Y,Z 分别和 AX,BX 取 min,假设 YA<ZB,则当容量为 lcm(A, B) 时,全部取 Y 最优。设 lim=√n,当 A>lim 时暴力计算,否则枚举 B 选择的次数,显然不超过 lim,直接计算。
时间复杂度 O(T√n)。
C:设 a=x+3y,b=3x+y,则一组 (x,y) 唯一对应一组 (a,b),且容易写出 a,b 对应的取值范围,那么转化为类似二分图匹配的问题,假如枚举 a,可以发现对应的 b 应该是 mod8 和 3a 相等的,且在一个区间(可计算)内,随着 a 增加单调不降,于是可以贪心选择最小的合法 b。用 set 维护即可。
时间复杂度 O(nlogn)。
D:见 数数
E:当 2∣n,m 时,黑白染色后显然只有两种方案。
否则不妨设 n≤m,如果 n 为奇能放置的最大值为 (n−1)m/2,因为每列的最大就是 (n−1)/2,且方案有 n 种,将相邻起来合法的两种方案连边, 则每个点的度数为 2,构成了长度为奇数的环,则方案可以看做从某个点开始走 m 步回到原点的方案,也就是 (x+x−1)mmod(xn−1),n 可以接受循环卷积,m 很大,因此多项式快速幂即可。
否则 n 是偶数 m 是奇数,类似上一种,但由于一定不会走一圈,方案就是 (nn/2)。
时间复杂度 O(nlogn)。
F:q-binomal,不会,爬了。
ARC140
A:枚举整周期算。
B:设包含 R 的 ARC 有 a 个,ARC 有 b 个,答案就是 min(2a,b)。
C:随便构造。
D:对于一个已经形成的基环树可以直接计算答案,否则每个连通块恰有一个需要连边的点,dp 枚举一下构成环的点,容易计算答案。
E:随便想了一个构造 ai,j=(i/23+j/23+ij)mod23+1,然后就真的过了(
F:见 数数
ARC141
B:显然答案长度不超过 logn,且下一个数的最高位比当前最高位大,直接 dp 即可。
C:对于一个给定的括号串算出对应的 p,q 是容易的,直接贪心即可。
直接根据 p,q 得到原括号序不太容易,考虑画出折线图。对于一段 ≥0 的必然是直接从左到右加入,对于 <0 的必然是选一个左括号后选一个右括号,此时 p2i−1>p2i,反之必然成立,因此可以根据 p 来得到所有 <0 的左右括号位置。
由于对称性,q 就可以确定所有 ≥0 的左右括号位置。若根据 p,q 得到不到所有字符串或有差异无解。否则再根据最初的贪心 check 即可。
时间复杂度 O(n)。
D:最重要的观察是 M≤n≤2M。意味着是几乎每隔两个位置就要选一个的。形式化描述,即对于一个 a,形如所有 a×2k(2∤a) 的最多选一个,假设 ka 是 a 选择的对应的 k,对于 a1∣a2,必然 ka1>ka2。容易发现每个 a 能选择的 k 构成了一段区间 [la,ra],对于 a1∣a2,则 ra2<ra1,la1>la2,一个 x 满足条件当且仅当其对应的 a 满足 la≤kx≤ra。构造是容易的,只需要构造集合 {r1,r3,…,x,l2p+1,…,l2M−1}。
时间复杂度 O(MlnM)。
E:一维问题是经典的裴蜀定理。推广到二维,首先做一些变换:
- b←b−a,c←c−a,d←d−a,此时变成 (x,x+b) 连边 (x+c,x+d)。
- 将 (x,y) 变成 (x,y−x),显然该操作不会影响答案,此时变成 (x,b) 连边 (x+c,d−c)。
此时若 c=0,对于某个 x 就成了一维问题。若 b=d−c,设 x 行形成 u 个连通块,x+c 行形成 v 个连通块,则将 x 和 x+c 合并后变成 gcd(u,v) 个连通块。
我们想尽量让所有的连边都满足以上两种条件中一种,c=0 是可遇不可求的,若要让 c=0,我们考虑再将某一行平移若干个单位,将每个 (x,y) 变成 (x,y+dx),希望 b+dx=d+c+dx−c。
呃..但是 x 可以取 [0,n) 所有值,考虑还是变成 (x+wy,y),条件就 wb=wd−c+c。考虑用带权并查集维护,当 b 和 d−c 不在同一个连通块就加边 (d−c,b,c),这样合并后取 gcd。
否则在同一个连通块,那就满足第一个条件了,直接对 c 取 gcd 即可。
时间复杂度 O(nα(n))。
F:
ARC142
B:每一行交替放,形成一个排列后加上 (i−1)n 即可。
C:随便交互一下。
D:强大的。
考虑当树是一条链时显然只有 1,n 不放的情况,又要保证任意次操作后局面唯一。那就是将树划分成若干条有向链,每条链除了链头都有 piece。而且还要满足一个链头不能作为另一个链首,只有链身才可以有边相连,这条边是不会通过点的。
自然考虑 dp,设 dp0/1/2/3/4/5/6/7/8 分别表示当前点:
- 链身,是否有入度 / 出度。
- 链头,是否有入度。
- 链尾,是否有出度。
然后按照拼接过程 dp 就可以了,一共有 21 种转移,讨论不难。
大概是:
trs(0, 1, 1), trs(0, 4, 1), trs(0, 2, 2), trs(0, 6, 2), trs(0, 3, 0),trs(1, 3, 1), trs(1, 2, 3), trs(1, 6, 3),trs(2, 3, 2), trs(2, 1, 3), trs(2, 4, 3),trs(3, 3, 3),trs(4, 2, 5), trs(4, 6, 5), trs(4, 7, 4),trs(5, 7, 5),trs(6, 1, 7), trs(6, 4, 7), trs(6, 5, 6),trs(7, 5, 7);
初始 f0/4/6=1,答案是 f1,3/5/7。
时间复杂度 O(n)。
E:浴眼顶针,鉴定为纯纯的网络流。
首先假设 bx≥by,则 ax,ay 至少要是 by,不满足则加上。
然后需要选 x 或 y 变成 bx。
假如执行完后一个 x 满足 ax<bx,表示 x 所有的匹配对应的 y 全部取到了 ay,此时若 ax←bx 则会满足所有 x 的限制。
对于 ax=bx 的点,其不会主动加 ax,因为它是作为一个 by 被选的,考虑建一排边,第 i 个点表示 ax 加上了 i,可以连边 (u+1,u,∞),(u,T,1)。
那么就是一个最小割了,对于所有限制 (x,y),连边 (S,x,bx−ax),(x,(y,bx−ay),∞),其中 (y,bx−ay) 是让 y 加上 bx−ay 的那个点。
F:先简化问题。
对于单个 wizard,假设其所有的 2 操作时间为 t1,t2,…,tk,贡献为 ∑ti−(k+1)k2。
两个就是总时间减去 (k1+1)k12+(k2+1)k22。
由于本质不同的操作其实很少,可以讨论:
- 当 (a,b)=(c,d),直接对应加上即可。
- (0,0),(0,1) 可以视为只对 2 的限制,(0,0),(1,0);(0,1),(1,1),(1,0),(1,1) 同理。
- (0,0),(1,1) 和 (0,1),(1,0) 比较特殊。
注意到若 k 相同,2 操作越靠右越优。如果确定了 (0,0),(1,1) 和 (0,1),(1,0) 的方案。可以分别二分得到最优的 ans1,ans2。
而 (0,0),(1,1) 显然也是选择后缀最优。(0,1),(1,0) 也满足吗?确实(但我不会证明
于是可以枚举两种特殊的选择情况,然后算出来答案即可。
时间复杂度 O(n2logn),可以优化到 O(n2)。
ARC143
ARC144
C:当 2k>n 无解。否则可以打表发现当 n≥4k 可以先填入 k+1,k+2,…,2k,1,2…,k 然后将 n←n−2k。使得 2k≤n<4k。
还可以打表发现,当 n≤3k 时,形如 (l+k+1,l+k+2,…,n,l+1,l+2,…,l+k)(l 是之间 n 减去的总和)。
否则先得到 n=3k 的答案,剩下的是在最后加入 i=l+3k+1,交换倒数 i−2k 和 i−k,再交换 i−k 和 i。
时间复杂度 O(n)。
D:如果 x⋂y=∅,则 f(x)+f(y)=f(0)+f(x+y)。令 g(x)=f(x)+f(0),则 g(x)+g(y)=g(x+y)。显然每一位独立。
相当于枚举一个 f(0)=v≥0,然后有若干个正数和负数,满足正数和 ≤K−v,负数和 ≥−v 的方案。
对于一个 x≥0,y<0,合法的 v 有 min(0,K−x−y) 个,而 x+y 是所有数的绝对值和,因此可以枚举非零数个数,答案为:
n∑i=0(ni)2iK∑s=0(K−s)(s−1i−1)
而 (K−s)(s−1i−1)=(K−s1)(s−1i−1)=(Ki+1) 。
直接计算就是 O(n)。
E:先考虑弱化版,如果要求所有 1 到 n 的路径权值相同,先将每个点拆成 i 和 i+n,连边 (i,i+n,ai)。类似于差分约束,即给每个点确定一个权值 dx,使得 ∀(u,v,w)∈E,s.t.dv=du+w。(u,v 必须在一条 1→n 的路径上 )
再考虑若 gcd=x, 则在 modx 意义下所有点的 du 应该是唯一的,且 d1=dn=0 。若在所有 ai≠−1 的情况下判定 x 是否合法,可以用带权并查集判断。
如果存在 ai=−1 可以忽略 (i,i+n) 这条边,还是用带权并查集维护,对每个连通块维护最大的合法 x 使得条件成立,当合并 (u,v,w) 时,若 (u,v) 已经同属一个连通块,x 要满足 disv≡disu+w(modx),即 x∣disu+w−disv 再取 gcd 即可。
否则直接令 disv=disu+w,再取 gcd,初始为 0。非法当且仅当操作完所有边后 x 还是 0。
F:
AGC002
C:显然若存在相邻两个 ai+ai+1≥L 必然有解,只需要从 1−i,n−i+1 顺序构造即可。
D:整体二分,每次加入 [l,mid] 的边,用并查集维护连通性,若 szx+szy≥z 则一定合法。先处理 [mid+1,r] 的询问,再撤销 [l,mid] 的边,处理 [l,mid] 的询问。
E:将所有糖果从大到小排序,看做二维平面上的矩形,则一次操作可以描述为从 (x,y) 走到 (x+1,y) 或者 (x,y+1),初始在 (0,0),要求时刻都在矩形内部,走到边界告负。
显然边界一定是必胜态,向上向右都是必胜态的是必败态,画图发现,设 f(x,y) 表示 (x,y) 的状态,若 x+1 和 y+1 都不是边界,则 f(x,y)=f(x+1,y+1), 因此对角线上的状态是相同的。
找到 (1,1) 对应的最大对角线上的点,之后只能一直往上或往右,由于往右时上面的点是必胜态,因此当前点的状态只和到达边界的距离有关,设 d1 表示往右能走的距离,d2 表示往上走的距离,若 d1,d2 其中一个是偶数则当前一定必胜,判断一下即可。
F:一个显然的 dp 是设 dpi,j 表示从后往前考虑到第 i 个位置,目前已经放了 j 个白球的方案,转移只用组合数算一下即可,但时间复杂度太高。
AGC003
C:三操作等价于对所有奇数位置排序,所有偶数位置排序,显然二操作只要把奇偶分别归类即可,设 i 最后的位置为 pi,若 i 和 pi 不同奇偶则需要一次,答案是 ans2。
D:将所有数分解质因数,每个质数幂可以对 3 取模,则对于一个数 a,和它形成 cube 的 b 是唯一的。只用把所有的互斥对 (a,b) 找出来,贪心选择更大的最优。
问题变成怎么找 b,直接 O(√V) 分解不优秀,Pollard Rho 太繁琐。设 B 为 V 的三次方根,对于 ≤B 的 p 暴力分解,对于剩下的 p,有几种情况:
- 若只有一个 p,则 p>B,显然可以直接找到。
- 若形如 pq(p>B,q>B) ,则 p2q2 显然超过范围,不存在和 a 互斥,直接累加。
- 若形如 p2,只用判断是否为完全平方,也可以直接找到。
时间复杂度 O(nB)。
E:显然若 i<j,qi>qj,qi 必然没用,于是可以把 q 变成单增的。
搞个暴力 dp:设 fi,j 表示进行了前 i 次操作,只考虑前 j 个数的每个数的出现次数数组,转移:fi,qi×⌊kqi⌋+fi,kmodqi→fi+1,k,答案是 fn,qn。
我们只要有效转移,找到最后一个 <k 的 qi 转移即可,由于 kmodqi≤k2,因此暴力递归的层数是 O(logn) 的,但由于要记录每个数的出现次数,时间复杂度还是 O(n2logn) 的。
不妨考虑每个 fi,j 对最终答案的贡献,设 ci 表示 fi,qi 被计算的次数,初始 cn=1,从后往前遍历,递归到底层时,一定是一个前缀和的形式,因此可以直接利用差分数组统计。
时间复杂度 O(nlogn)。
F:首先不要读错题意,k+1 级分形是对每个初始矩形,若为黑色填入一个 k 级分形,否则填入全白。
由 于初始黑色是连通的,若左右拼接连通,上下拼接连通,答案一定是 1。反之,若左右都不连通,上下都不连通,答案一定是 cntk−1,其中 cnt 是黑色个数。
否则,上下和左右有且仅有 1 个是连通的,不妨假设左右连通,设 si 表示 i 级分形的连通块个数,c 表示初始的左右相邻的黑色,ui 表示 i 级分形中一行最开始和末尾都是黑色的个数,则从 k→k+1 的过程中,连通块的合并只会在这 c 个左右相邻的格子间进行,且每次会合并 ui 个。
容易写出递推式:
si=si−1×cnt−cui−1,ui=ui−1×cntlr,其中 cntlr 是初始满足一行开始和末尾都是黑色的个数。矩阵快速幂即可。
时间复杂度 O(logn)。
AGC004
B:直接枚举操作 2 的次数,则每个颜色相当于有一个选择区间,直接取最小的即可。
C:由于题目保证边界上的点不会被染色,考虑直接将第一行给 A,最后一行给 B,对于每一列而言,我们交替染色即可,这样一定能保证连通。
D:连边 i→pi,会形成一个基环树,显然无法满足条件,因此只能将 to1 设为 1。问题变成改变一些点的父亲使得每个点到根的距离不超过 k。
贪心,若一个点子树内最大深度 =k−1,且这个点的父亲不是 1,就把它和 1 连边,这样显然是最优决策。
E:将 bot 平移看做 E 在平移,则 E 能得到的 bot 一定是一个矩形。向左平移 d 时,最右侧的 d 列会消失,设 dpl,r,u,d 表示当前向左平移了 l,向右平移了 r,向上平移了 u,向下平移了 d 获得的最大矩形,由于同一个 l,r,u,d 可以唯一对应一个剩余局面,每次枚举一个方向转移即可,得到了也是一个区间的形式。
但要开一个 108 的 int 数组,开不下,但是 nm≤10000,于是可以把 int 换成 short,就可以卡过去了。
F:先考虑 m=n−1 的情况。
AGC005
C:先找到直径,根据直径奇偶性进行判断。
- 若直径为奇数,则说明直径中心是一个边,边上两个点的最远点都应该是 mx+12,否则无解。且只有这两个点的 d=mx+12,其他点的 d>mx+12 且个数 ≥2。
- 若直径为偶数,直径中心唯一,恰好存在一个点 d=mx2,其他 d>mx2 至少有两个。
D:容斥,钦定 l 个 |Pi−i|=k,则 Pi=i−k 或 Pi=i+k,转化为二分图模型,容易发现该二分图是由若干条链组成的。因此只要把链上答案算出来后卷起来即可。
链上选点不相邻是经典问题,答案是 (n−k+1k)。
时间复杂度 O(n2)。
E:对两棵树分别以 x,y 作为根进行 dfs,则 A 的策略一定是通过来回走同一条边来使得 B 不断往返。设 (x,y) 为 A 中一条边,若在 B中 disx,y≥3 且 A 到达 x 时 B 不在 x,则 A 可以等到 B 靠近 x 时走到 y,若 B 走到 y 距离为 1,则 A 可以回到 x ..。
称这样的 (x,y) 为必胜点,若 A 到达这样的点则无法结束。考虑什么时候 A 能走到必胜点,一定是 A 走到的点的深度 d0x 永远小于这个点在 B 的深度 d1x,才能不被抓住。
若不存在这样的点,显然 A 只能尽可能到达 B 中深度越大的点,然后等死。
F:显然对每个点计算贡献,设去掉 x 后剩下子树大小分别为 s1,s2,…,sm,若至少有两个子树内选点则 x 必选,容斥一下就是 (nk)−m∑i=1(sik)。
设 cnti 表示一共有多少个 s=i,则 ansi=n×(nk)−n∑j=1cntj(ji),显然可以卷积优化。
时间复杂度 O(nlogn)。
AGC006
B:显然 X=1 或 X=2n−1 无解,否则,我们可以考虑将 X 放在中间,并在 X 左右填入接近 X 的数,使得相邻两个的中位数都是 X。容易发现,只要有相邻两个数一样,则最后顶上那个数一定是 X。
简单构造即可。当 X≥3 可以 X−1,X,X+1,X−2;当 X≤2n−3 时可以 X+2,X−1,X,X+1。
C:设 fi,j 表示经过 j 轮跳跃后 i 点的期望坐标,则有 fi,j=2×fi−1,j−1−fi,j−1+2×fi+1.j−1−fi,j−12=fi−1,j−1+fi+1,j−1−fi,j−1。
考虑其差分数组:fi−fi−1,fi+1−fi,变化为 fi+1−fi,fi−fi−1,于是等价于交换差分数组相邻两项,而 k 次可以描述为单轮跳跃得到的置换 k 次幂的结果,快速幂即可。
D:二分答案 k,则变成 01 问题。根据 B 的结论,若在越靠近中点的位置有相邻两个相同的数,则顶端都会是这个数,二分后从中点依次扫描。若不存在相邻相同的数,就是出现次数多的数。
E:可以看出,每一列的数是基本上不变的,变化的只有顺时针和逆时针,因此若初始矩阵不是单增或单减则误无解。否则,将每一列按照最小数标号,将单增看作正数,单减为负数,问题等价于选择相邻三个位置翻转,且取反符号,最后要变成 1,2,…,n 的排列。
显然奇偶数和位置要对应,同时手玩可发现,可以将距离差为 2 的两个数统同时变成相反数,此时奇偶位独立,对应位置上负数个数为偶数,此时可以将所有数看作正数。两个奇数位置的交换会影响偶数位的负数个数。而一个序列经过相邻交换变成升序次数的奇偶性相同,通过树状数组维护一下逆序对即可。
也存在 O(n) 做法,由于任意一个方案的奇偶性都是相同的,找到所有置换环,只需要考虑相邻两个元素的交换次数。而交换任意两个元素的次数必为奇数。一个长度为 l 的置换环对于整个序列的奇偶性改变为 (l−1)mod2,可以直接计算。
F:转化为图论模型。
AGC007
B:首先构造将所有 ai+bi 全部相同,再依次将 ap1+1,ap2+2 就可满足条件,于是先保证 a 的差 >n,就可以构造。
C:把整个直线倒过来,显然不影响答案,此时每个线段都贡献了经过次数的 2d1+(2n−1)x 倍,因此只要算出所有距离都是 1 的答案即可,
考虑第一次推球后,有 1n 的概率减少开头或结尾的线段,n−1n 的概率合并两条线段,则新的第 i 条线段的期望为:
d′1=d1+n−1n×1n−1d1=n+1ndi。
通过数学归纳法可以证明:在进行 k 次操作后,所有线段的期望长度是相同的,为:ei=n+1n+1−i。
因此答案为:2d1+(2n−1)x2n−1∑i=0ei。
D:设 dpi 表示收集完前 i 个金币的最小时间,则:
由于 xi−xi−1 是必然要走的,因此可以忽略。
直接对 xi−xj+1 和 T 的大小分类讨论。当 xi−xj+1>T 时,记录 dpj−xj+1 最小值即可。
E:
二分答案 lim。设 dpx,l,r 表示考虑 x 子树内的所有叶子的经过顺序,目前 x 距离第一个叶子为 l,最后一个叶子为 r 的最小花费,转移:dpx,l,r=minpminq[p+q≤lim](dplc,l,p+dprc,q,r+p+q)。左右儿子可以交换。
然后是经典优化:若两个状态 (l1,r1),(l2,r2) 满足 l1≤l2,r1≤r2 显然 (l2,r2) 没用,因此所有状态按照 l 排序后,r 是单降的。在转移中固定 lc,l,p,当 q 越来越大时,r 越来越小,因此只需要保留 最后一个 q 满足 p+q≤lim 的点,可以双指针。得到 x 的所有状态后再保留合法状态即可。
若一个有 x 个状态的点和 一个有 y 个状态的点合并,会得到 2min(x,y) 个状态,类比启发式合并的复杂度,因此总状态是 O(nlogn) 级别。
F:
AGC008
B:从开头末尾向中间涂色,设区间 [l,l+k−1] 作为一个辅助区间,则 [1,l) 的所有正数可以选择,[l+k,n] 的所有正数可以选择,[l,l+k−1] 要么全部选择要么全部不选。枚举 l 找最大值即可。
C:显然 T 型和斜的两个根本不能加入,只考虑 1×4,2×2 和两个 13 的情况。
除了 2×2 单独拼接起来,两个 1×4 拼起来外,唯一的一种还能拼成的情况是两个不同 13 和 一个 1×4 拼成一个 2×6 的矩形。枚举拼的个数(只可能是 0,1,2,min(cnt3,cnt4)),算一下即可。
D:贪心,设 p 第 p 次出现位置为 pos,则要求 [1,pos−1] 前有 p−1 个 p,[pos+1,n2] 有 n−p 个 p。以填前缀为例,将所有数按照位置,每次选出现位置最靠前且还需要填数的位置,填上要求的数。再从后往前扫一遍即可。
时间复杂度 O(n3)。
E:考虑 {pi} 的置换环集合。设一个长度为 l 的置换环,元素分别是 p1,p2,…,pl。有如下对应方案:
- 所有 ai=pi,此时 p,a 置换环相同。
- 所有 ai=ppi,即 ai 是 i 走两步的结果。若 l 为偶数,则会形成两个大小相同的置换环。若 l 为奇数,则得到的还是一个大小为 l 置换环。
- 部分 ai=pi,此时的 {ai} 是由主环和每个主环上的点附加若干个点的链构成的内向基环树森林。
判断有无解就很简单了,对于一个纯纯的环上的点,degi≤1;对于基环树上的环,degi≤2,否则 degi≤1。
环和基环树是独立的,每个环和每个基环树也是独立的,分开考虑。
对于基环树上的链,要把这些链压进原置换环内部,要求是原环上的相邻两个点最多插入一个链上的点,且不能与其他的链上的点有交叉。
设 u 点上有 l1 个链,u 上一个有链的是 v,和 u 距离为 l2,则方案数为:
- l2>l1,两种方案,和 u 相连的第一个链上点直接放在 u 的前面;放在 u 上一个点的前面,然后交替插入。
- l2=l1,一种方案,只能在 u 前面放,不能在 u 上一个点前面放。
- l2<l1,无法放置。
对每个基环树考虑每一个有链的点,方案数相乘即可。
再考虑环,设大小为 i 的环有 cnti 个,根据上面的分析,每个环要么是单独成环,要么和与它大小相同的环构成大小为 2i 的环。
枚举拼起来的个数 2j,方案数为:
- 选出来,(cnti2j)。
- 互相匹配,1×3×…(2j−1)。
- 拼的方案,第一个点有 i 种方案,ij。
- 当 i 为奇数且 i>1,没有匹配的环有两种方案,2cnti−2j。
F:
AGC009
B:把打败关系建成一棵树,设 dpx 表示 x 获得胜利最浅的深度,则依次枚举儿子 y,新的深度为 max(dpx,dpy)+1,而我们要最小化,按照 dpy 从小到大加入最优。
时间复杂度 O(nlogn)。
C:排序,设 dpi,0/1 表示考虑前 i 个数,且第 i 个数选择加入 A / B 集合的方案,转移枚举一段区间 [l,r],要求区间差值 ≥A,l−1 和 i+1 差值 ≥B。转移都是单调区间,随便双指针算一下就好。
D:考虑点分树的结构,和题目所给的 Uninity 条件相同,问题等价于深度最小的点分树。
此时直接按照重心分治不是最优的,但容易得到答案不超过 O(logn) 级别,可以考虑状压。
点分树的一个等价表述为:给每个点一个 label,满足对于任意 不互为祖先关系的 (x,y),有 l=lca(x,y) ,labell<min(labelx,labely)。 深度就是最大的 label。
不知为何我们可以考虑贪心,注意到在最终答案中若 label=x 出现了,则所有 <x 都出现了。将 label 的定义反过来,即 (x,y) 的 lca label >labx,laby。
设 dpx 表示 x 子树内所有出现过的 label 的集合。若两个点 lca = x,则 x 的 label 要大于 dpy1∧dpy2 最大的二进制位。同时越小越好。贪心选择即可。
时间复杂度 O(n) 或 O(nlogn)(取决于是否使用二进制函数)。
E:
AGC010
B:显然可以得到总操作次数,判掉显然无解的情况。设一次操作的开头是 p,考虑其差分数组的变化(设 b1=a1−an),发现除了 p 之外,其他 bi 都减少 1, bp←bp+n−1。设 p 作为开头次数为 k,则满足 bp+k(n−1)−(tot−k)=0⇒k=tot−bpn,只要满足 n∣tot−bp 且 k≥0 即可。
C:选择一个度数 >1 的点当根(若 n=2 特判),容易发现非叶子节点的决策是固定的,设 fx 表示 x 往上伸出去的点的个数。s 表示 ∑fv,若 x 子树内互相匹配了 c 个点,则满足 s−2c+c=ax⇒c=s−ax,因此 fx=s−2(s−ax)=2ax−s。满足 0≤fx≤ax。
但满足这个条件是不够的,因为子树内总共有 s−fx=2ax 个点,要满足完全匹配,最大的 fv 不能超过 ax。
D:若当前局面存在 1,则会影响先后手的只有偶数的个数。若有奇数个偶数,先手必胜;否则后手必胜。
若不存在 1,但如果先手能一直保持 gcd(a1,…,an)=1 且有奇数个偶数,同样胜利。由于不可能全为偶数,先手只要一直操作偶数,若所有数都是奇数,则他们的 gcd 显然也是奇数,除以 gcd 后奇偶性不变。因此只要有奇数个偶数先手一定胜利。
否则,有偶数个偶数,先手希望通过操作奇数使得 gcd≠1,若奇数个数 >1 显然不行,此时后手必胜。
若奇数个数 =1,先手只能操作这个奇数,操作完后若 gcd=1 则后手必胜,否则所有数必然 /2,交换先后手继续模拟,总次数不会超过 logV 次 。
E:根据经典套路,若 (ai,aj)≠1,则它们的相对顺序不会发生改变,建出 DAG。若只要求最小字典序直接贪心 toposort 即可。但现在可以任意排列,Takahashi 的策略一定是讲所有点按照编号大小排序给边定向,Aoki 再找最大的 topo 序。
F:神必结论题。注意到若存在边 (u,v) 且 av≥au,初始在 u 的点一定不会走到 v,因为后手总可以回到 u,且始终满足 av≥au。
因此一个点 u 只能走 av<au 的点,注意到是 DAG,随便 dp一下即可。
AGC011
B:随便算一下即可。
C:若存在 (a,b) 到 (c,d) 的路径,则说明存在长度相同的 a→c 的路径和 b→d 的路径,由于可以重复走点,实际的要求是存在 a→c 和 b→d 奇偶性相同的路径。
涉及到路径奇偶问题,考虑二分图。若原图的一个连通块是二分图,则 a→b 的路径奇偶性唯一;否则可以走奇环改变路径奇偶。
考虑新图连通块的组成。对于一个二分图,只由这个连通块内部的点组成的二元组, (a,b) 同奇偶 / 不同奇偶显然形成了 2 个连通块。对于一个奇环,显然只有一个连通块。
再考虑 a,c 分属不同连通块的情况。设二分图有 c0个,非二分图 c1 个。若同属奇环贡献为 c1×(c1−1);若不同奇偶,奇环会把偶环合并,贡献为 2×c0×c1;若都是偶环贡献为 2×c0×(c0−1)。
需要特殊考虑孤立点的情况,贡献为 2×c2×(n−c2)+c2×c2
D:设 A = 0, B = 1,通过暴力模拟可以发现,每次放入一个球:
- 若 a1=0,a1=1。
- 否则,将所有 a 取反,向右循环移位 1 位。
于是可以 O(1) 模拟一轮。只需要记录当前点的位置。
再模拟发现,经过足够多次操作后,a 逐渐趋近于 ...BABA。当 n 为偶数时,为 BABA..,否则在第一位反复横跳。且操作次数和 n 同阶。
暴力模拟 4n 轮即可,容易计算最终态。
E:根据 CF908G 的套路,一个满足位数递增的数,总可以拆分成若干个 11…1 相加的结果。且拆分的个数不超过 9。
二分答案 x,则需要用不超过 9x 个 11…1 得到 n。即 9x∑i=110pi−19=n。化简可得 9x∑i=110pi=9n+9x。
等价于 9n+9x 的数位总和不超过 9x,用高精度算一下即可。
时间复杂度 O(nlogn)。
F:?
AGC012
B:设 dpx,i 表示对于点 x 距离不超过 i 的标记的时间最大是多少,并记录当前颜色,然后 O(nd) 转移。
C:先考虑怎么暴力算:枚举分割点 p,设 dpi,j 表示在 [1,p) 中考虑到 i,[p,n] 考虑到 j 的方案,然后 O(n4) 转移。
借鉴分界点的思路,我们考虑先加入 [1,100] 的数,在后面加数一定能拼成 2k 个数,将 s 二进制拆分,设 k 是最大的满足 2k−1≤n 的数,则直接加入 [1,k] 的数,n←n−k,剩下的 1 位从大到小加入,若第 d 位为 1 则让第二轮出现的 [1,d] 和 当前数拼起来,且当前的数不会和后面的数拼起来。即直接加入 2,4,…,2k 后,再加入 2d+1 即可。
D:将所有可以互相交换的球合并成一个连通块,则答案是 ∏si!,因此只需要处理连边。
直接暴力建边有 O(n2),显然不行,考虑将同色点连边和异色点分开。对于同色点而言,只保留 wi 最小的连边;异色点,也必然是每个同色的最小值相连,找一个最小和不是最小颜色的次小连边即可。
E:注意到只会跳 logV 次,本质不同的背包只有 log 个。对于单个 V 可以将绿洲划分成若干块,每一块之间都可以互相到达,看做若干个区间。题目即在每个 V 划分成的区间中选择一个,使得第一个区间包含指定点 i 且所有区间的并为全集。
注意到我们只用处理前后缀拼起来,而且第一次划分出来的区间也最多只有 logV 个(否则即使只选第一次的区间也我复发满足条件),设 fS,gS 分别表示只使用 S 中的区间所能包含的最长的前 / 后缀,一个 [l,r] 满足当且仅当存在 S 满足 fS≥l,gU/S≤r。
fS,gS 转移是简单的,只用对每个点的 logV 次包含的区间转移即可,可以做到 2logV×logV。
设 m=logV,总时间复杂度为 O(mn+m2m)。
AGC013
B:我们只要保证路径的两个端点都是叶子就好了,随便找一个点为根 dfs 出来一条路径,标记上面的所有点,再找另一个叶子即可,可以将边集 reverse 一下再搜。
C:老套路题了。只用注意到两个 ant 相碰看做编号 swap,而且所有 ants 的相对位置不变。唯一难解决的是环上的起始标号,但容易发现若有一只 ant 顺时针走过原点 0,可以看做标号全部左移 1;若逆时针走过 0,看做标号右移 1,就可以得知 0 后面第一个的标号。
只需要模拟一下,时间复杂度是排序的复杂度 O(nlogn)。
D:好的计数方式。
初始的想法:考虑如何判定一个颜色序列是否合法,对黑白球分别维护一个直线表示每次取球的变化,将二者的历史最小值加起来,若 ≤n 则合法。
但我们无法直接维护历史最小值,注意到总球数不变,因此可以倒推直接把黑白球个数记下来。设 fi,j 表示经过 i 次操作后黑色有 j 个的方案,初始 f0,i(0≤i≤n)=1;每次若取出黑白 / 白黑不变;黑黑 j−1;白白 j+1,但是显然这样做会算重。
考虑什么样的方案会算两遍:当且仅当他们的直线可以通过上下平移完全重合,我们不妨找到一个基准点,一个方式是强制让折线经过 y=0,这样所有本质相同的方案都变成了一种方案,只需要在 dp 中加入当前是否经过 y=0 即可。
时间复杂度 O(n2)。
E:考虑 ∏ai 的组合意义,即在选出来的分界线每个选出两个球(有序,可以相同)的方案,设 fi,0/1/2 分别表示当前考虑 i 所在的区间选择了 0/1/2 个点的方案,转移是简单的,只用分类讨论标记点和非标记点,可以用矩阵快速幂优化。
F:先考虑单次询问怎么做:先将 X 中的 n+1 个二元组排序,若小的那个数是第一个位置显然选小的,有 1 的贡献
AGC014
A:如果 A=B=C 答案为 -1,否则模拟。
B:如果有一棵树,每次操作等于 ax xor 1,ay xor 1,然后 dfs 整棵树,注意到非法至少有一个 ax=1,直接判断即可。
C:求出 S 到 (x,y) 只经过解锁格子的最短距离 s,设从 (x,y) 再走 t 步到达边界,则当 s≥k 时贡献为 ⌈s+tk⌉,否则贡献为 1+⌈tk⌉。对于每个点,若 s≤k 按照第二种计算,否则按照第一种计算,容易证明答案一定能取到。
D:如果两个叶子有同一个父亲,先手必胜,否则先手操作父亲 x,后手必然操作这个叶子..,以此类推。容易发现,若原树存在完美匹配,则先手选择任意一个点,后手都可以选择匹配点,后手必胜。反之先手必胜。
于是原树存在完美匹配是后手必胜的充要条件,直接 dfs 一遍即可。
时间复杂度 O(n)。
E:考虑贪心地断边,对于所有 (ci,di),在原树中将 (ci,di) 的路径上的边全部加入 i 表示在 i 来之前这些边都不能断。每次找到 sz 最小的一条边,若不为 1 无解,否则执行这次操作。
用树剖维护,时间复杂度 O(nlog2n)。
F:考虑到小的数不会影响到大的数,因此考虑值域从大到小加入元素,维护当前集合的最小操作次数。以下讨论都假定 [2,n] 已经加入,目前操作次数为 f。
加入 1 后,新的 f′ 只可能是 f 或 f+1,原因显然,考虑什么时候能 + 1,当且仅当 1 的位置不是 1。但是无法直接维护 1 的位置。
-
引理 1:不是第一个位置的前缀最大值一定不可能成为第一个位置。
解释:设 x 为 premax,其前一个 max 为 y,考虑一次操作后,y 会变成 x 前面一个数。如果 y 移动 x 必然移动。因此 x 绝不可能成为第一个元素。
设操作 f−1 (需要满足 f≥1) 后当前第一个位置的值为 v。
-
引理 2:v≠2 。
解释:若 v=2,因为再操作一次变得有序,而 2 会变到后面,非法。
假设 i 的位置为 posi,则考虑 1 和 2,v 的位置关系,有 pos1<posv,posv<pos1<pos2,pos1>pos2,当满足 posv<pos1<pos2 时 f′=f,否则 f′=f+1。
-
引理 3:设 (x,y,z) 表示 x<y<z 或 z<x<y 或 y<z<x 是否成立,则所有时刻 (v,1,2) 不变。
解释:分类讨论即可,读者自证不难。
因此根据引理 3 可以得到新的 f′,若 f′=f+1,则新的 v=i+1,否则不变。
推广到 >1 也是成立的,只需要找到第一个 f≥1 的位置然后依次判断即可。
时间复杂度 O(n)。
AGC015
A:模拟。
B:对于每个极长的 UD 连续段算一下。
C:二维前缀和统计点的数量 - 边的数量。
D:首先把 L,R 相同的高位删掉,最终答案一定有这些位,找到第一个不等的位 d,后,若 L+2d≤R 答案是 2d+1−L,因为 [0,2d−1] 可以表示,可以选择 d+1 是否为 1。否则选择 L 为 0 的位变成 1 后面随便选,是若干个区间取并的形式,可以直接计算。
E: 考虑 i,j 相遇时间 Xi−XjVj−Vi,将每个点看做 (Vi,Xi),则 −ki,j 就是 i,j 相遇时间,若 a→b,b→c,则有 0>ka,b>kb,c。
考虑每个点能感染到哪些点,首先 ka,b<0 的点是显然的,若 ka,b>0,不妨假设 Vb<Va,发现只要有一个 Vc<Va 的且 ka,c<0 的就可以把 b 感染。因此考虑求出最小的 Vl 满足 ka,l<0 和最大的 Vr 满足 ka,r<0,那么按照 V 排序后 [l,r] 中的所有点都可以被感染。若存在 b<l,则 Vb<Va,会发现 b 和所有间接到达的点的斜率都小于 l 到这些点的斜率,因此必然无法到达。
于是就变成若干线段 [l,r]覆盖 [1,n] 的问题,BIT 维护即可。
F:咕咕咕。
AGC016
B:首先极差不超过 1。否则根据极差分类讨论。
- 若极差 = 0,要么所有颜色互不相同,要么至少存在一种颜色出现 >1 次,此时所有颜色出现次数都要 >1 次,因此检查 a1 是否 ≤n2 即可。
- 若极差 = 1,必然是一段 1 后一段 >1 的,类似检查即可。
C:若 h∣H 且 w∣W 无解,否则考虑所有满足 h∣x 且 w∣y 的所有点,所有 h×w 的矩阵包含恰好一个点,选择一个权值 v,把这些点设为 −(hw−1)v−1,否则设为 v。当 v 越大时越可能合法,取 v=1000 即可。
D:首先能操作出来的只有初始的 ai 和 ai 的异或和,且操作 i 后操作 j 等价于将 aj 设为 ai,再操作 i 就实现了交换 ai,aj。 假设 v 等于异或和,当 不存在 bi=v 时就求出置换环大小即可。
否则还是先将 (ai,bi) 连边,考虑形成的 >1 的环,必然是选择一个点变成 v,然后依次执行操作,将下一个点变成 v。当环中不存在 v 时需要 len+1 次操作,否则最后一次操作可以忽略。直接模拟即可。
E:记 fi 表示所有的 j 表示为了使 i 活着,哪些 j 必须活着,初始 fi,i=1,从后往前扫询问 (x,y),若 fi,x=1,fi,y=1 i 非法。若一个为 1 把另外一个设为 1,否则不动。若 (i,j) 合法那么二者的交集应该为空。
用 bitset 优化,时间复杂度 O(nm+n2w)。
F:先对于固定局面求出 SG 函数,若 f2≠f1 先手必胜。于是考虑统计 f1=f2 的方案。
考虑 dpS 表示只考虑 S 中连边的方案,使得 f1=f2,考虑按照 SG 值从小到大分层转移,枚举当前层 S,SG = 0,上一层 T,则要求 S 之间不能互相连边,所有 T 都要和至少一个 S 有连边,S 连向 T 的边无所谓,预处理一些东西后 dp 即可。
时间复杂度 O(n3n)。
AGC017
A:随便算。
B:必然存在一个位置 p 使得 p 之前全填整数,后面填负数,求出答案区间即可。
C:[BJOI2019] 删数
D:设 fu 表示以 u 为根得到的 SG 函数,考虑 u 的所有儿子 v 连边 (u,v),同时对所有 v 子树内点连边 (z,0),容易发现新的 f′v=fv+1,因此 fu=xor fv+1。
E:
F:
AGC018
C:经典反悔贪心,在另外模拟费用流中有。
D:先求重心,先假设重心唯一,如果要求走出一个哈密顿回路的话,答案就是以重心为根后所有边的 2sz,这个界显然可以取到。但现在不是回路,那么选择重心连接的边最小的贡献 - 1即可。
否则有两个重心,显然可以每次选择两个不同部分的点,只有连接两个重心的边只会算 n−1 次,减去即可。
时间复杂度 O(n)。
E:先考虑计算从一个矩形走到一个矩形的方案,设两个矩形分别为 (x1,y1,x2,y2),(x3,y3,x4,y4)。令 F(a,b)=(a+ba),G(i,j,a,b)=(a−i+b−ja−i)
ans=∑x1≤i≤x2,y1≤j≤y2F(i,j,x3,y3,x4,y4)。
而 F(i,j,x1,y1,x2,y2)=G(x2+1,y2+1,i,j)−G(x1,y2+1,i,j)−G(x2+1,y1,i,j)+G(x1,y1,i,j)。
因此可以分别把第 1, 3 个矩形都差分成 4 个单点,每个单点有一个容斥系数,那么就变成了一个点到一个矩形再到一个点。
考虑直接枚举进入点和出去点,贡献就是两个点的曼哈顿距离。
注意到贡献可以拆开,考虑只枚举一个点,是以下上走到该矩形的还是以左右走到该矩形的,就是两个组合数相乘的形式。
时间复杂度 O(n)。
F:首先有解必然存在一种情况满足每个点的权值为 −1,0,1。、且可以根据儿子的奇偶性确定点权的奇偶性,如果两棵树上对应点权不等直接无解。
否则一定有解,考虑一个欧拉回路的建图:先把两棵树建出来,再建立一个虚根和原树两个根连边,则一个点的奇偶和度数相等,如果一个点为奇数,则在两棵树上对应点连边,然后跑欧拉回路,根据奇度点的连边情况即可确定为 -1 还是 1。
AGC020
B:从后往前递推,维护当前答案的区间,容易算出对于一个 x 在经过 x 之前的区间。
C:用 bitset 求 01 背包,注意到若 x 可行,则 sum−x 可行,因此直接从一半开始找第一个即可。
D:容易发现最小连续长度 k=max(a/(b+1),b/(a+1)),最后的答案一定形如前缀若干个段 AAAB,然后再若干个 BBBA。考虑二分这个边界,求出剩下的 a,b,若 ak≥b 表示当前边界合法。输出方案是容易的。
E:先考虑怎么对固定的字符串求答案,可以通过区间 DP,设 fl,r 表示答案,枚举第一个循环串,则 fl,r=∑kgl,kfk+1,r。而 gl,r 可以通过枚举循环节同样计算。
现在考虑原问题,f 的求解不变,g 的求解相当于要把同一个位置上按位与。然后记忆化搜索求解。
F:先断环为链,为了避免末尾的线段延伸到开头来,将最长的一个线段视作在最开头并固定。先枚举 n−1 个线段开头的小数的相对大小,相当于将一个点拆成了 n−1+1 个点,然后做一个状压 DP 即可。
时间复杂度 O((n−1)!2nn2)。
AGC021
B:考虑一个点的管辖区间是一个平面,如果这个平面有限概率为 0,否则只和构成该平面的两个射线的最小的夹角有关,而原问题相当于取 A 和其它点的中垂线,容易求解。
C:如果 A,B 都是偶数显然是划分成 2×2 的方格最优。
否则先 2×2 划分,划分到附近的位置分类讨论即可,具体细节不表。
D:原问题等价于更改 k 个字符后的最长的回文子序列长度,直接 DP 即可。
E:显然 R<B 无解, R≥B+n 一定有解。否则一定是 R−B 个变色龙多吃一个 R,剩下的 R 和 B 相同。如果 R=B 则最后一个球一定是 B。假设当前 R>B。R−B 个变色龙一定吃了 RB。于是有解当且仅当能取出 n−(R−B) 对 RB 子序列,这等价于未匹配的 B 最多有 B−(n−R+B)=R−n 个,等价于将 R 视为 1,B 视为 -1,任意前缀和 ≥n−R。容易格路计数。时间复杂度 O(n)。
F:设 dpn,m 表示 n×m 表格每行至少一个黑的方案,答案为 ∑(ni)dpi,m。边界 dpn,1=1,否则考虑按列转移,枚举上一列有多少含黑的行。如果从 dpi−1,k 转移到 dpi,j。若 k=j 方案显然是 1+j+(j2)。否则可能会有新的 A 在当前列取到。分类讨论当前新加入的 j−k 行有多少是最值。若都是方案为 (jj−k)。只有一个方案为 2(jj−k+1),都不是方案为 (jj−k+2),求和得到 (j+2j−k+2),于是 dpi,j=dpi−1,j(1+j+(j2))+∑k<idpi−1,k(j+2j−k+2),容易拆开组合数然后用 NTT 优化,时间复杂度 O(nmlogn)。
AGC022
B:n=3 特判,否则选 2 的倍数和 3 的倍数,使得总和为 6 的倍数,最后两个数特判。
C:贪心,然后做个背包。
D:答案是 2L 的整数倍,每个 t 先膜 2L,然后做一个类似匹配的问题贪心选出若干个匹配。
E:先考虑判定是否合法,维护一个栈,由极长 10 组成,每次加入一个数,若为 0,则看是否存在 2 个 0,如果是弹出,否则加入。否则直接加入。
如果为 1,存在 0 就直接抵消。否则只有一个 1 加入,否则忽略,然后做一个 DP 套 DP 即可。
F:建树,每个点的贡献为 2dep(−1)k,答案只和每个点贡献的多重集有关,假设一个点有 k 个儿子,会有 ⌊k2⌋ 个儿子和该点的符号相同,剩下的相反。考虑 DP,设 dpi,j 表示当前有 i 个点,最后一层有 j 个点钦定有奇数个儿子,枚举下一层节点个数 k,在不考虑当前儿子下有 (j+k)/2 个点权和父亲不同,再枚举真实的和父亲不同的点的个数 l,则 fi+k,|l−(j+k)/2|←fi,j×(i+ki)(kl)。
答案 fn,0。
AGC023
B:注意到同一个对角线上答案相同,因此只用 check O(n) 个。暴力即可。
C:都是一些套路的集合,蓝的鞋。
D: 考虑最后列车到达的位置,必然是 1 或者 n。考虑每个人的投票策略,设当前列车位置为 p,若 p<x1 或 p>xn 所有人策略相同。否则若 P1≥Pn,车一定先到 1 。证明可以归纳:
- 如果 Xn−1<p<Xn,除了 n 的人其他都想往左走。
- 否则 p<Xn−1,考虑走到 1 之前是否走到了 n−1,如果走到了就是上面的情况,否则也不会经过 n 。
假设先走到 1,然后会从 1 一直走到 n,也就是说 n 号楼的人的利益和 1 号的利益是相同的,直接累加 p1←p1+pn 将问题规约到 [1,n−1] 上面。
E:考虑枚举两个数计算其为逆序对的方案。如果固定了每个数能选的区间则方案为 ∏(ai−i+1)。设 P 为初始的乘积。zi 为 ai 的排名,分类讨论 ai 和 aj 的关系:
- 如果 ai<aj,则方案为 P(ai−zi+1)(aj−zj+1)(ai−zi+1)(ai−zi)2∏ai<ak<ajak−zkak−zk+1
- 如果 ai>aj,用总方案数减去 j 作为较小值的即可。
然后根据套路用树状数组维护所有贡献即可。时间复杂度 O(nlogn)。
F:根据 exchange argument 的套路,用 c1c0 作为当前点权值排序从小往大选,每次选了就把该点和父亲合并,用并查集 + 小根堆维护即可。
时间复杂度 O(nlogn)。
AGC024
B:等价于选出最长的一个子序列满足其是连续的,直接递推即可。
C:首先判无解。若 a1>0 或 ai−ai−1>1 无解。否则一定有解,考虑一段极长的相差为 1 的区间,可以通过 ar 次操作得到。因此可以计算答案。
D:设直径长度为 D,则答案为 ⌈D2⌉。
枚举最后是在边还是在点,作为根,对每一层求出两个子树的该层的个数,取较大的设为 ci,则叶子要有 ∏ci 个,这是显然的。
E:原问题等价于每次新插入一个数要求新的字典序大于原来的。
设插入了 x,对应位置上的数为 y。若 x<y 非法,x>y 一定合法,x=y 则找到原来 y 的极长连续段下一个位置 z,若 y>z 合法。注意到等价于直接在 z 处插入 x。这样既方便了计数又可不重不漏。
考虑对该过程建树,如果有 x,y,则 x 向 y 连边(下标),则合法的条件变成了对每个节点赋 [1,k] 的值,每个点权值大于其父亲权值。考虑设 fi,j 表示有 i 个点,根权值为 j 的方案,转移 fi,j=i−1∑k=1∑t>jfk,tfi−k,j(i−2k−1)。容易前缀和优化,时间复杂度 O(kn2)。
F:考虑直接枚举每个串作为答案检验是否合法。一个串匹配的过程可以视为子序列自动机,因此只需要记录当前已经匹配的位置和未匹配的位置,做一个 DP 即可。
AGC025
B:随便计算即可。
C:如果确定了 B 的排列,则 A 的决策是简单的:设当前在 p,找到距离 [l,r] 最近的位置走过去。而后手一定会不断选 r 最小的区间,l 最大的区间交替选,于是直接模拟即可,将区间排序枚举第一次走到是什么即可。时间复杂度 O(nlogn)。
D:先考虑只有一个限制怎么做,将满足条件的点连边,我们希望其是二分图。可以证明一定是二分图,原因如下:
设 d=4p×q,则距离为 d 的两个点横纵坐标差可以分别表示为 2p×a,2p×b,满足 a2+b2=q,按照 qmod4 讨论:
q≡1(mod4),则 a,b 奇偶性不同,只考虑 mod2p 的所有点,按照黑白染色即可。
q≡2(mod4),则 a,b 都是奇数,按照 a 的奇偶染色即可。
对 D1,D2 都做一遍,根据鸽巢原理至少有一个集合大小 ≥n2,直接输出即可。
E:显然答案有上界 ∑min(2,ci) 猜测一定能达到这个上界。
考虑剥叶子,若该边未被经过显然可以,若 c=1 直接将端点为 p 的设为 fp。若 c≥2 则取出两条出来,剩下的更改端点。对于选出的两个点 (u,x),(u,y),直接替换为 (x,y) 不影响答案。最后如果方向为 x→y 则还原为 x→u,u→y,反之亦然。
时间复杂度 O(n(n+m))。
AGC026
B:分讨即可,细节不表。
C:考虑直接 meet-in-the-middle,用 hash+map 维护回文串即可。
D:考虑 DP,限制等价于若上一个位置存在两个相邻的相同,则下一行需要和上一行完全相反,否则既可以相同也可以相反。设 dpi,j 表示前 i 个位置,目前最低的 hp=hp+1,若 j=hi 表示不存在,容易转移,注意到将所有区间离散化后可以批量转移,时间复杂度 O(n2) 或 O(n3)。
E:考虑 DP,设 fi 表示考虑到 ai⋯n,bi\cdotsn 得到的最大字符串。如果都删直接从 fi+1 转移过来,否则设 a,b 分别表示位置,分类讨论:
- 若 ai<bi ,只用考虑夹在中间的 a,这些显然全部删才最优,设 k 为第一个没有夹在中间的 a,则 ←"ab"+fk。
- ai>bi,只考虑夹在中间的 b,这些显然全部保留才最优,而保留这些位置可能使得更多的位置被保留,直接模拟即可,找到第一个未保留位置 k,同样从 k 转移过来。
AGC027
B:考虑一轮走出去又回来的过程,设捡了 p1,p2,…,pm 垃圾,则代价为 p1+m∑i=1(i+1)2(pi−pi+1)=5p1+∑i≥2(2i+3)pi。因此考虑直接枚举捡的次数,按照排序不等式贪心分配每个 pi 前的系数,可以调和级数求解,时间复杂度 O(nlnn)。
C:合法当且仅当存在一个导出子图满足 AB 边都有,类似拓扑排序更新即可,时间复杂度 O(n)。
D:首先黑白染色,同色点互不影响,不妨令 maxmodmin=1,那么考虑确定白色后,黑色就设为相邻白色的 lcm+1 。对于白色可以取所有素数,每个对角线取相同的数,为了避免相同的黑色需要给副对角线上也设一个素数。
E:根据套路,设 A 为 1,B 为 2,一次操作相当于将相邻两个数 (x+y)mod3,若得到 0 则非法。再考虑判定一个串是否能被生成,发现只需要贪心地选取前缀即可,最后会剩下一个后缀,需要满足和 mod3=0。设 dpi 表示匹配到前 i 个数,转移就预处理一个 nxti,j 表示 i 开头的下一个 j 位置是什么,直接转移即可。注意特判不存在相邻相同的初始字符串。
F:由于 n 太小,直接枚举第一次操作的 (x,y),则 x 不能再被操作,将 x 作为两颗树的根,一个点会被修改当且仅当该点在两棵树上父亲不同,如果一个点不会被修改且其父亲要改则无解。否则考虑修改的偏序关系:A 中一个点比其父亲优先修改,B 中一个点比其父亲晚修改,如果建出图是一个 DAG 则有解,操作次数就是在两颗树上父亲不同的点的个数。时间复杂度 O(n3)。
AGC028
B:显然是每个点有一个贡献 pi,考虑对删除过程建出笛卡尔树,则在删除 x 时 y 有贡献当且仅当 x 是 y 祖先,即每个点的贡献为其深度,而每个点深度也可以枚举每个点作为其父亲,等价于区间最先删的数为其,贡献为 1+∑j<i1i−j+1+∑j>i1j−i+1,容易计算。
C:可以转化为对每条边选择要么 au 要么 bv 计入答案。则每个点 x 有 4 种被选的情况。考虑怎样构造一个哈密顿回路,显然最后的 00 和 11 个数相等。若 00 11 都不存在则只能全是 01 或 10.若存在至少一个 00。首先让 00,11 内卷到都只剩 1 个,再让 01 和 10 内卷到都剩下一个。手玩可以发现,对于 ≤1 个的 00,11,10,01。怎么都是合法的。
然后考虑怎么最优化,先贪心选全局最小的 n 个数,如果合法直接输出。否则一定是第一种不合法情况,此时只需要多一个 00 和 11 就可以合法。考虑用 an+1 替换 an,若仍然不合法说明 n 和 n+1 同组,此时要么删 n+1 加入 n+2,要么删 n−1 加 n 都是最优的合法方案,直接判断取最小值即可。
时间复杂度 O(nlogn)。
D:考虑断环为链,则联通等价于相交且不包含。接下来考虑连通块的构成,一个连通块对应一个区间,满足区间端点属于连通块。考虑设 fl,r 表示 [l,r] 这个连通块的答案,显然可以做一个经典容斥,设 gi 表示 i 个点两两匹配方案,则 fl,r=gcl,r−r−1∑k=lfi,kgck+1,r,其中 cl,r 表示区间 [l,r] 未确定点的个数,答案为 ∑l,rfl,rg。
E:
F:考虑倒着求出每个点能到达的点权和,预处理出 mn/mx(i,j,k) 表示 (i,j) 在第 k 行能到达的纵坐标极值,我们希望区间中所有不是障碍的点都可以到达,如果满足则可以 O(n3) 求答案。
为了达到目的,每当遇到上面,左边都是障碍的格子,就把当前点设为障碍并更新前缀和,并尝试更新其右边和下面。时间复杂度 O(n3)。
AGC029
B:显然,先消去和越大的数越优,于是直接贪心,排序后双指针即可。
时间复杂度 O(nlogn)。
C:直接二分最大字符集,用一个栈模拟进位的过程。即若 ai<ai+1在后面加 0 即可。否则需要删去 ai−ai+1 的后缀,让 ai+1+1。若产生的进位则将该位置 0 并向前一位进位。维护所有非 0 的位置即可。
D:贪心,显然先手能动必须动,不能动当且仅当 (x+1,y) 有障碍物。动态维护当前能走到的最靠右位置即可。
E:如果 u 的答案有 v,设 w 为 u,v lca,则必然是走到 w 再走到 v,能扩展当且仅当 w 到根最大值大于 w 到 v 最大值。考虑 v 到根最大值 x,则 x 到 v 的点(不包括 x) 都可以作为合法的 w,其他的都不合法,x 是否合法只用关心最大值。直接 dfs 一遍即可。
时间复杂度 O(nlogn)
F:假设 1 为根,假如能在每一个集合中选出一个数,则可以从 1 开始 DFS,将 1 所在的所有集合的选择的点父亲设为 1,然后继续 DFS 这个过程。根据 Hall 定理可以说明其正确性。因此用 Dinic 跑最大匹配即可。时间复杂度 O(n√n)。
AGC030
B:最优策略一定是往某个方向一直走若干步后,左右横跳,于是只需要枚举走到次数,可以用前缀和维护。
C:如果 k≤500,直接令 ai,j=i 即可。否则考虑每个数填一个对角线,也能满足条件,且我们可以在一个对角线上交替填数,恰好能满足 n=2k 的情况。
D:设 dpi,j 表示 (i,j) 构成逆序对的概率。对于一次交换操作只会对涉及到 x 或 y 的点对有影响,容易计算。时间复杂度 O(nq)。
E:考虑 01 中间画红线,10 中间画蓝线,假设开头有无穷个红蓝线交替,两字符串可以得到当且仅当他们对应的红蓝线相等,每次操作可以移动一个红线或蓝线,要求任何时刻相邻的是红蓝且距离 ≤2。假设已经确定了对应关系,显然答案可以取到匹配两个点的距离和,证明显然。于是直接枚举匹配起点终点(只有 O(n) 种),直接计算即可。
时间复杂度 O(n2)。
F:先考虑所有都是 −1 怎么做,显然枚举了最小值后需要有 n 对匹配,这等价于括号匹配,因此合法个数为卡特兰数。否则将所有对分成三类,两个都存在的不用管,(−1,−1) 的顺序在最后乘上阶乘即可。考虑 DP,从大到小填入所有数,设 fi,j,k 表示 ≥i 的数,有 j 对 (−1,−1) 填入了一个数,k 个 (−1,x)。若当前数未出现则要么可以使 j−1,j+1 或者 k−1。若出现了要么使 k+1 要么使 j−1。
时间复杂度 O(n3)。
AGC031
B:先把极长的相同颜色缩起来,然后设 fi 表示考虑到前 i 个元素的答案,显然有 fi=fi−1+flst。
C:显然若 A,B 二进制数相差为偶数无解。否则类似格雷码地按照最高位构造即可。设 solve(n,x) 表示 n 维终点为 x 的方案,分类讨论 x 最高位情况递归下去。
D:显然 f(p,q)=q∘p−1,然后:
可以发现,下一项 p→q,p−1→q−1,q→q∘p−1,q−1→p∘q−1
考虑 A=q∘p−1∘q−1∘p 这个东西在变换前后不变
因此 a5=A∘q−1,a6=A∘p∘q−1,a7=A∘q∘p∘q−1,a8=A∘q∘p−1∘q∘p∘q−1=A∘p∘A−1,因此 an=A∘an−6∘A−1。直接计算。
E:考虑直接枚举选择的点个数 t,则最多 a 个 ≤b 可以转化为从 a+1 个开始坐标 >b,同理最多 a 个 ≥b 可以转化为截止到 t−a 坐标 <b。对每个选择的点用新建的两个点表示其 x,y 坐标,然后跑最小费用最大流即可。
AGC032
B:先假设所有边都被保留,则 i 的邻接和为 n(n+1)2−i,希望全部减去 n,于是考虑 (1,n−1),(2,n−2) 删掉,若 n 为奇数显然可行。
否则 n 为偶数,全部减去 n+1,即 (1,n),(2,n−1),… 即可。
C:显然需要满足每个点度数为偶数。若存在一个点度数 ≥6,则可以从这个点开始拆成三个环。若所有点度数为 2,非法。
否则每个点度数为 2 或 4,且至少有一个 4。如果 4 的个数 ≥3 显然有解。如果只有一个 4 度点无解。否则要么形成一个杏仁要么形成三个简单环,只有后面那种是合法的,可以直接判断。
D:等价于花费 A 的代价将一个数往后插入。或者花 B 代价往前插入。显然可以转化为找一个递增序列。设 fi,j 表示考虑到前 i 个数,最后一个保留的数为 j 的代价,随便转移即可。时间复杂度 O(n2)。
E:排序后,一定存在一个位置 p 满足 p 之前两两匹配且和 <M,p 之后两两匹配和 ≥M,直接二分即可。
F:对于每刀而言,把切的第一刀标记为红色,旋转 2π3 后标记成蓝色,再旋转 2π3 后标记成绿色,那么答案就是异色线段之间的最短距离。
引理 1:在 [0,1) 之间随机选择 n−1 个点分割成的 n 条线段当中,第 k 小的期望为 1n(k∑i=11n−i+1)。
证明:当 k=1 时,即是最短线段的期望,计算所有线段 ≥x 的概率,积分可得:
当 k>1 时,采用归纳法证明即可。
只考虑 [0,2π3) 这一部分的贡献,因为剩下两部分是对称的。
由于异色线段最小值只有可能在相邻两个点之间取得,枚举异色线段为第 k 小,这要求前 k−1 小的线段都是同色的,概率就是 3n−i+1−3n−i[i≠n]3n=3−i+1−3−i[i≠n],因为 n 个线段不可能全部同色,于是答案就是:
ans=13nn∑i=1(3−i+1−3−i)i∑j=11n−j+1=1nn∑j=11n−j+13−j
时间复杂度 O(n)。
AGC033
B:最后合法的位置一定是一个子矩形,倒序维护即可。
C:显然,答案只和直径有关系,直接拉出直径分类讨论即可。
D:暴力就是设 dpl,r,u,d 然后枚举分界点,注意到答案是 log 级别,于是考虑经典套路交换定义域和值域,即 dpi,j,k,l 表示左上角为 (i,j),右上角为 (i,k) 且 ≤l 时最大的 y 是多少,转移分类讨论后用双指针+二分维护。
E:假设 s1=r,则显然不能存在相邻两段为 B。若 s 中没有 B 这即为充要条件,可以简单 DP 求得。否则考虑 B 将整个环划分成了若干段,考虑 s 中第一个 B 之前的 R,设有 k 个,则每一段中 R 的个数都是奇数,且长度不超过 L+1,对于其他的 R 也有同样的限制,只不过限制从 L+1 变成了 L。问题就变成了对这样的环计数。考虑将一个 B 和后面的 R 打包一起处理,同样做一个 DP 即可,可以前缀和优化。
时间复杂度 O(n)。
F:考虑压缩 G,若存在 (a,b,(a,c) 且在 T 中存在一条路径顺次包含了 a,b,c 则删除 (a,c) 加入 (b,c) 不影响答案。则最终 x,y 有边当且仅当存在一个序列 a1=x,a2,…,ak=y 使得存在边 (ai,ai+1) 且 T 中存在一条路径顺次包含了a1,…,an。则对于一次加边 (a,b),设 p(a,b) 表示 T 中以 a 为根距离 b 最近的且在 G 中与 b 相连的祖先,就直接加入 (b,p(a,b)),否则对 b 子树打上标记,碰到边时压缩即可。
时间复杂度 O(n(n+m))。
AGC034
B:显然贪心从前往后删是最优的,可以发现一段极长的 A 后面解一个 BC 可以得到 A 的个数,于是直接模拟。
C:先二分,假设 ai 确定了,则所有 ai≥bi 的取 ri 否则取 li。考虑一个增量法,初始先所有 a=0,然后不断 + 1,会使得一些 l 变成 r。考虑移项后,设 S=∑libi,则问题可以抽象诚 n 个分段函数使得和最大,显然最多会有一个 0<x<X 直接枚举并判断即可。
时间复杂度 O(nlogn)。
D:直接拆开曼哈顿距离,对于每个点拆出 4 个点 x+y,x−y,−x+y,−x−y 分别连边,最小费用最大流就是答案。
如果 n 更大可以模拟费用流解决问题。即为 ”图论科技“。
E:直接枚举汇聚点,则变成了一个经典问题,设 dpx 表示 x 子树内最多能消掉多少点,如果 mx≤sum/2 则可以全消,否则 sum−mx 能消,2mx−sum 留在最大的子树,则 dpx=sum−mx+min(2mx−som,dpson),若 2dpx=sumx 则合法。
时间复杂度 O(n2)。
F:显然有 fi=∑jfixorjpj+1,即 F=FP+I,乘法定义为集合幂级数异或卷积,但是当 i=0 不成立,实际上的 F=FP+I−c ,可知 c=2n,即 F=I−c1−P,因此做 FWT 直接除即可,但是可能没有常数项,也无妨,输出时直接输出 fi−f0 即可。
AGC035
B:显然 m 为奇数无解,否则随便找一个生成树,让非树边随便选,则树边唯一确定。
C:先考虑 n 是奇数,那么对于 i 是偶数而言,连边 (i,i+1),(i+1,n+1),(n+1,i+n),(i+n,i+n+1),连边 (1,2)。
如果 n 是偶数,在上面的基础上挂上 n,2n 即可。因此当 n 为 2 的幂次时无解。
D:显然答案是每个 ai 乘上一个系数,倒着考虑这个过程,就是初始有两个数,每个系数都是 1,中间插入一个数,系数为两个的和。考虑 DP,设 f(i,j,l,r) 区间 [l,r] 目前确定了 cl=i,cr=j,(i,j) 的贡献,转移枚举断点即可,甚至不用记搜。
时间复杂度 O(n22n)。
E:考虑建图 (x,−2),(x,x+k),初始所有点都是黑色,每次选择一个点染白且其后继染黑,显然白色点必然构成一个 DAG,问题转化为选择一个子集满足内部不存在环的方案数,由于图的特殊性可以考虑 DP。将奇偶排成两列。如果 k 为偶数则奇偶是独立的,此时很容易统计答案,等价于不能连续选 k/2+1 个数。如果 k 为奇数,则经过的 (x,x+k) 为偶数,如果形成环则必然是恰好经过了 k+2 个点的简单环,做一个 DP,设 fi,j,k 表示前 i 层,左右侧节点的连续段分别是 j,k 的答案,如果从左侧开始的最长链长度 ≥k+2 且经过了右侧点必然形成环,转移只需要对当前左右侧是否选点分类讨论即可。
时间复杂度 O(nk2)。
F:如果一行一列恰好形成了一个框不妨假设行去延伸。猜测只要不存在非法的列取延伸的情况则选择方案和答案形成双射。可以用反证法证明,具体细节参照 [[数学记录]AT5143 [AGC035F] Two Histograms - command_block 的博客 - 洛谷博客 (luogu.com.cn)]。于是直接容斥这个东西,钦定 k 个不好的列,则方案为 (nk)(mk)k!(n+1)m−k(m+1)n−k,答案就是 min(n,m)∑i=0(−1)ifi。
AGC036
B:假设当前栈第一个数为 x,设 nxtx 为下一个和 x 相同的位置,则操作到 nxtx 时下一个栈中第一个元素为 nxtx+1 ,考虑连边可以 O(1) 计算最后的栈中第一个元素,然后直接模拟即可。
时间复杂度 O(n)。
C:等价于满足 3 个条件:∑=3m,最大 ≤2m,奇数 ≤m ,不难猜测即为充要条件,如果没有第二个限制直接枚举奇数算,否则最多有一个枚举和,此时第三个限制必然满足,也随便组合数算。
时间复杂度 O(n+m)。
D:将不存在负环转化成差分约束存在一组解,则边可以描述为 :xi+1≤xi,若 i<j,xj≤xi−1。若 i>j,xj≤xi+1。第一条说明 x 递减,不妨设 di=xi−xi+1,则第 2,3 条可以描述为 di+di+1+⋯dj−1≥1,dj+dj+1+⋯di−1≤1,显然 d∈{0,1},假设确定了 d,则考虑所有删除的区间,第一类必然是所有 0 连续段,第二类必然是所有 ≥2 的区间。因此考虑一个 DP:设 dpi,j 表示当前考虑到 i 且 di=1 上一个 dj=1 ,根据这两个就可以计算所有贡献,时间复杂度 O(n3)。
E:先把极长的缩在一起,然后不妨假设 cnta≤cntb≤cntc,反复将 BCB 缩成 B 直到 cnta=cntb 或不存在该结构。然后反复将 XBY 缩成 XY 直到 cnta=cntb 或不存在该结构,其中 XY 可为空但不能都为 A。然后不断将 CBC 缩成 C 直到 cnta=cntb,然后将 XCY 缩成 XY 直到 cntb=cntc。最后将 ACA,BCB 缩成 A B。即可。证明略。
F:容易转化为 pi∈[li,ri] 的计数问题,若没有下界是经典问题,否则考虑容斥,钦定 k 个数 <li 考虑如何计算方案,仍然形如 i−pi+1 的乘积,考虑前 n 个数按照 l 排序,后 n 个数按照 r 排序,设 fi,j 表示考虑到前 i 个数,目前有 j 额钦定的,若当前是后 n 个数,则前面小于它的为前面后 n 个数的个数+前面钦定的数。否则若选择 l,同样是 c1+j ,否则注意到当 i=0 时的 r 比 i=n 是要小的,因此前面 n 个数所有被钦定的 k 个都满足,未被钦定的只有前面的前面的 n 个数个数,后 n 个数不变。
时间复杂度 O(n3)。
AGC037
B:显然直接让第 i 次出现的颜色给第 i 个人就是一种最优决策,而答案和第二个数无关,则一个方案合法当且仅当最优策略中是是第三个数的仍然是第三个数,直接记录当前 rbg 个数即可。
C:倒过来变成 Bi←Bi−Bi+1−Bi−1。而此时 B 最大值旁边的数显然不可操作,若 Bp≠Ap 一定是最先操作最大的数,然后递归执行这个过程,用一个堆维护之即可。
时间复杂度 O(nlogn)。
D:C 变成 D 只需要每一行是一个排列,B 变成 C 只需要每一行元素在一列中恰好出现一次,不妨让 x 的颜色为其所在行,则问题等价于将 A 每一行任意排列后使得每一列恰好包含所有颜色。考虑一列一列地求解,则显然可以建一个网络流模型:每一列为左部点,每种颜色为右部点对应连边,若流为 n 则合法,我们直接每一次的匹配方案即可。问题是可能前面取的方案使得后面无解。但是还有 k 列未被选择时该图是一个 k 正则图,根据 Hall 定理可得一定有完美匹配。
E:若 k 太大直接将最小字符输出 n 次,否则 k≤14 左右,贪心过程是先将最小字符用一次操作移动到末尾,然后不断倍长,最后一次以其为前缀输出,则先直接找到一次倍长后的最小字符串然后模拟一下即可。
F:考虑先如何判定一个序列为 (K,L)。如果只有一个数显然合法,所有数相同且长度 ≥L 合法,否则一定是先把最小值+1,要求极长最小值长度所有的 ≥L,设长度为 t 则变成 ⌊tL⌋ 个 x+1 然后继续做。容易发现最后留下的数一定是初始的最大值。
由于涉及到最大值,考虑从左往右扫描线有单调栈维护。
AGC038
B:考虑什么时候两次排序操作会重复,要么该都没改,要么 [i,i+k] 中最小值为 i 最大为 i+k 直接用并查集维护即可。
时间复杂度 O(n)。
C:莫反套路题,蓝的鞋。
D:先把只有一条路径的点对合并起来,则有多条路径的必不联通。若没有 1 类边显然答案是一个区间,设连通块个数为 k 则最小为 k−1 最大为 k(k−1)2 。否则若只有两个连通块无解,否则最小为 k。
E:Min-Max 反演,然后推一下柿子可以转化成背包。
F:分别考虑两个排列的置换环,则每个环可以选择转或者不转。考虑 Ai=Bi 的条件,分类讨论 Pi,Qi 的情况:
- Pi=QI=i :无论如何 Ai=Bi。
- Pi=i,Qi≠i:Q 不转。
- Pi≠i,Qi=i :P 不转。
- Pi≠i,Qi≠i :P,Q 都不转。
- Pi=Qi≠i :P,Q 都转或都不转
考虑最小割建图,每个点分别向 S,T 连两种边表示是否转,则分别连边 qi→T,S→pi,qi→pi,pi→qi,然后跑最小割即可。
时间复杂度 O(n√n)。
AGC039
B:显然必须是一个二分图,否则应为最大的两点距离+1。跑 floyd 即可。
C:操作等价于将二进制最低位取反循环移位一次。考虑在 a 后面接一个 ¯a 则操作直接变成了循环移位。则操作次数应该为 2n 的循环节。考虑直接枚举循环节计算有多少个串满足循环节为 t 的因数,然后在容斥一下即可,注意到 t∣2n,t∤n 然后求一下即可。
时间复杂度O(nlogn)。
D:欧拉线:三角形外心,重心,垂心三点贡献,设 A,B,C,则 2AB=BC。对于原问题的三角形 (A,B,C),取其三条弦的中点,则原来的内心等价于新三角形的垂心,而外心显然是 (0,0),重心显然是 (x1+x2+x33,y1+y2+y33),可知垂心为 (x1+x2+x3,y1+y2+y3),且新三角形的三个顶点易得,因此容易计算答案。
时间复杂度 O(n) 或 O(n2)。
E:考虑枚举 1 号点的连边 k,则考虑 (1,k) 和 (k,n) 会有若干个匹配和 [1,k] 相交,注意到这些匹配不会互相相交,因此考虑枚举最靠上的匹配,设为 [x,y]。不难发现 (1,k) 必然存在一个分界点 u 满足在 u 之上的点和 x 联通,u 之下的和 k 联通,(k,n) 同理。于是考虑枚举这个分界点,容易发现可以转化为三个类似的子问题。于是设 f(x,l,r) 表示 [l,r] 以 x 作为分界点的答案,直接枚举上面提到的东西即可做到 O(n7)。由于常树很小可以通过。
AGC040
B:考虑左端点最大的区间和右端点最小的区间,则所有区间的交等于这两个区间的交,若在同一组显然可以只留下最长的区间,否则若一些在第一组,一些在第二组贡献为 max(0,min(ri)−L+1),设一个区间的 A 权值为 max(0,r−L+1),B 权值为 max(0,R−l+1),则问题等价于最大化 min(vai)+min(vbi),显然可以排序后双指针。
C:奇偶染色后变成不能消去 AA 或者 BB,充要条件为 A,B 出现次数 ≤n2,容斥一下很容易算。
C:若 Alice 能追上 Bob 则必然存在一个段使得走完这一段后 Alice 用时较少,于是考虑枚举 B 提前的时间(在 B 意义下),则最大的满足条件的 x 为 Bi−Ai 的前缀和。贡献就是找到最后一个和 ≤S 的位置 p,贡献为 pn+S−∑i≤pBiBp+1n。考虑先最大化 p。枚举 p,考虑 Bi−Ai≥0 的个数 c,若 c≥p 则必然是将它们按照 B 从小到大排序取前 p 个,次数最大前缀和就是所有 ≥0 的和。否则必然是一段前缀 <0 后接所有 ≥0 最后结尾的位置 ≥p,可以把式子写出来后贪心做。
时间复杂度 O(nlogn)。
D:如果只用一操作显然次数为 ai>ai+1 个数,否则不难想到将 a 拆分成 b,c,次数就是 bi>bi+1,ci<ci+1 个数。据此可以做一个 DP:设 fi,j 表示 bi=j,转移显然。可以写为 fi,j=min(fi−1,k+[j<k]+[j<ai−ai−1+k]) 不难注意到 fi,j 单调不增加且极差 ≤2,经过一些细致的分类讨论后可以 O(1) 维护。
E:转化为格路计数问题,根据移动到 y=x 对操作序列进行拆分,用一个三元 GF 分别表示两个棋子,步数,继而根据 Catlan 数写出其 GF,然后换元一一下即可根据另类拉格朗日反演求出。
AGC041
B:相当于操作 mv 次要求每个数 ≤m ,枚举这个数每次操作必须包含它,如果能随便选的数 ≥v 显然可行,否则必须选在 [p+1,i−1] 的数,贪心地尽量平均即可。
时间复杂度 O(n)。
C:n<3 无解,否则构造出 n=4,5,6,7 的所有答案,让他们全部填对角线即可。
D:显然只用考虑前后缀,只用考虑当 k=⌊n2⌋ 的情况。考虑一个调整法,初始所有 a=n,每次选择一个前缀 -1,维护 S= 前 k+1 个数 - 后 k 个数初始为 n,每次对一个前缀操作容易计算其变化量,答案等于一个完全背包。
时间复杂度 O(n2)。
E:考虑第一问,枚举最终汇合点 x 倒序考虑所有线段,若一端能到 x 则让另一端指向他,最后若所有点都能到则有解,直接做是 O(nm) 但是不难发现可以用 bitset 优化,上述操作就是等价于直接或起来。否则不存在的方案是很宽松的,还是考虑倒着做,维护能到达当前点的个数,若一个线段的一个端点 =n−1 了则不能指向他。直接模拟一遍即可,当 n=2 时无解。
F:考虑直接容斥钦定若干个格子没被覆盖则方案数为能放车的格子个数的幂次。枚举存在至少一个车的行,对于每一列而言,设其长度为 len,行的个数为 p,若没有被选则贡献为 2len−p,否则为 p∑i=1(pi)(−1)i=−[p>0],但是不能保证每一行真的有至少一个被选,就再容斥,钦定不选的集合 T⊆S,(−1)|T|,第一类贡献不变,第二类贡献变成 −[p>q]。然后建立笛卡尔树结构,我们只关心 p 是否等于 q ,一个节点 [p=q] 等于所有儿子的 [p=q] 和剩余行的 [p=q] 的并集,于是考虑设 dpi,p,0/1 表示节点 i,p,[p=q],转移第一位是背包,第二位是与起来,将儿子合并再考虑有一些行,每行就按照上面说的累乘贡献即可。
时间复杂度 O(n2) 或 O(n2logn)。
AGC043
B:注意到最后答案只可能是 0,1,2。若第二行有 1 则只可能是 0,1,否则将所有数除以 2 也可以变成只有 01 的情况,而此时可以写成 fi,j=fi−1,j+fi−1,j+1,因此 fn,1=n∑i=1(n−1i−1)ai,直接在二进制下计算即可。
C:显然可以按照 x+y+z 排序后贪心选,考虑贪心的过程,将所有边定向为从小到大,则一个点能选当且仅当其所有出边未选。类似一个 SG 函数,而这个游戏可以看作三个独立的 SG 函数,所有必败态就是答案,而一个 DAG 上 SG 函数为 O(√n) 级别,直接计算然后枚举一下三个异或为 0 的即可。
时间复杂度 O(n√n)。
D:注意到三个数若 a>b>c 则选了 a 必然接着选 b,c,因此将下降的缩在一起,就变成了普通的归并排序。因此将一个长度为 3n 的序列拆分成若干个极长下降连续段,首先满足长度 ≤3,而一组要么拆成一个 3,一个 12,三个 1。因此只需要满足 1 的段数 ≥ 2 的段数就能被构造出来,因此直接 DP:设 fi,j 表示前 i 个数当前 1 - 2 为 j 的方案。时间复杂度 O(n2)。
E:
F:
AGC044
B:相当于每次置一个点权值为 0,求每个点到边界的最短路,直接 01 BFS 一遍即可。
C:低位建 trie,操作一等价于打交换 12 儿子标记,操作二等价于全局 +1,直接给 012 儿子顺次移位后递归到 0 儿子即可。
D:首先问全 c 串可以知道 c 在 S 中出现次数然后可以把 |S| 求出来,设 g(A) 表示 S 只保留 A 得到的字符串,考虑如何合并两个 g(A),g(B)。维护一个串 c 表示当前合并的结果,每次需要判断下一次加入的是 g(A) 还是 g(B)。直接枚举加入 g(A) 然后直接把 g(B) 全部加入,如果 f(S,T)=|S|−|T| 则说明 T 是 S 的子序列。每次贪心地启发式合并即可。
E:首先考虑断环为链找到最大的 a 显然之后1不会再走了,放在最后同时令 a0=an,这样转成序列问题。有 fi=max(ai,fi−1+fi+12−bi)。如果没有 b 那直接求一个凸包即可。考虑给 f 加上一个 ci 满足 ci−1+ci+12−bi=ci,如果有则 fi=max(ai−ci,fi−1+fi+12)。 直接让 c0,c1 随便取得到所有 c ,然后直接求凸包即可。
时间复杂度 O(n) 。
F:
AGC045
B:先转化为绝对值最大值最小,求前缀和后变成极差最小,考虑枚举最大值,求出最大的最小值,可以贪心,先假设所有位置都是 -1,然后将一些 -1 变成 1,要满足当前的后缀最大值满足条件,预处理后即可 O(n) 计算。但显然不能枚举 O(n) 个最大值,但是注意到将最大值提升 2 后最小值也最多提升 2,因此只用检验最小的最大值和其 +1即可。
时间复杂度 O(n)。
C:不妨假设 A≥B,否则直接交换不影响答案,考虑找充要条件,经过一些理性分析得到若存在一段长度 ≥A 的子串所有的 1 段 长度 ≥B 则合法。然后对这个硬 DP 即可:设 fi,j,0/1 表示填入 i 个数目前不包含 <B 的后缀长度为 j 最后一段为 0 / 1 的方案,在第一次满足条件时统计答案。
时间复杂度 O(n2)。
D:显然 Snuke 的最优决策就是不决策,从左往右直接得到每个置换环,若一次操作不慎选到置换直接寄,同时若有未点亮的自环也寄。设第一个自环为 t,则合法当且仅当 [A+1,n] 中的点所在环都有 <t 的。枚举 t 再枚举前面有多少个点也是自环,则问题变成三个部分:[1,a] 随便填, [a+1,a+b] 不能连自环,[a+b+1,a+b+c] 随便填,方案数即为 a!a×(a+b−1)×(a+b+1)!=a(a+b+c)!/(a+b)。直接计算即可,时间复杂度 O(n2) 。
E:
F:
AGC046
B:显然有一个错误 DP:dpx,y=xdpx,y−1+ydpx−1,y,因为显然会算重,什么时候会算重呢?当且仅当第 x 行选的位置 <y 且第 y 行选的位置 <x 就会被统计两遍,减去 dpx−1,y−1×(x−1)×(y−1) 即可。
时间复杂度 O(n2)。
C:可以看作每个 0 管辖了一些 1。不妨在最后加一个 0。设 ai 表示第 i 个 0之前有多少个 1,容易发现一个 b 能得到当且仅当 ∑a=∑b,且 ∀i,∑j≤ibj≥∑j≤iaj,两个条件都很显然,然后随便 DP 一下即可。时间复杂度 O(n4)。
D:显然我们只关心目前剩余的一个后缀 s[i:n] 和能随便插入的 01 个数,设为三元组 (a,b,c),若两个三元组不同则得到的字符串一定不同,先用简单 DP 将所有可能合法的 (a,b,c) 记录下来,然后相当于到对一个后缀插入若干个 01,为了不重不漏规定 0 后面只能插 1,1 后面只能插 0 且最前面不能插数,否则可以规约到 a−1 的情况。也可以用一个简单 DP 得到,因此时间复杂度 O(n3)。
E:
F:
AGC047
B:一个字符串经过若干次删除后,可能会留下一个字符,然后拼上一个后缀,于是用 trie 统计一下即可。
C:原根一下变成加法,NTT 一下即可。
D:枚举第一棵书上的 lca 为 x,则从 x 的一个儿子出发,从另一个儿子回来。不妨假设为左儿子。然后 DFS x 左儿子的子树将贡献放在每个能经过的第二棵树上的点让,然后再从 x 右儿子统计答案即可。经过的点为 2nn 级别,可以接受。
E:先让 a3 造一个 1 出来,让 a3=a0+a1,然后再比较 a3 和某一个 0 即可,如果 a3 为 0 则全部数都是 0,后面的操作无论执不执行都是一样的。
然后分别对 a,b 考虑将其二进制拆分,就是从高位到低找到所有 1。方法是:先对要求的值 x+1,维护一个当前变量,每次造一个 2i 后加上当前变量与 x 作比较,然后再倍增这个值加当前变量上。则乘法就只用把所有 2i+j 造出来即可。
F:
AGC048
B:考虑调整法,先全部放小括号,设 ci=bi−ai,如果两个位置能以中括号互相匹配则必然满足奇偶性不同,于是直接将奇偶位置分开排序每次取最大的匹配即可。
时间复杂度 O(nlogn)。
C:根据 Ai=Bi 将原序列划分成若干段每段独立,观察到若一个 ai<bi∧ai+1>bi 一定非法。否则可以将序列划分成两段,第一段全部往左走,第二段全部往右走,每一段都很容易计算。
时间复杂度 O(n)。
D:不难猜测一次要么拿一个要么全部拿是,设 fl,r 表示 [l+1,r] 石子不变时,al 至少等于多少先手必胜。同理设 gl,r,考虑如何转移。先手如果直接取完则考虑 gl+1,r 和 ar 的关系,若 gl+1,r>ar 先手必胜,否则只能取一个来拖延时间,后手也是一样的,直到某次先手发现 br<gl+1,r 或者后手发现 bl<fl,r−1,则可以计算出要使得先手必胜 bl 至少要为 ar−gl+1,r+1+fl,r−1。同理可以计算出 g。答案只用比较 a1 和 f1,n 的关系即可。
时间复杂度 O(n2)。
E:
F:
AGC049
A:对每个点求出能到达它的点的个数 ci,则答案为 ∑1ci。
B:直接模拟一下 1 往左移的过程即可。
C:容易发现先要把所有 Bi<Ai 的全部吃了,在它们移动端过程中消灭所有 Bi≥Ai 的,否则如果存在 0 必然被摧毁。容易发现必然可以将所有 Bi<Ai 的所有并集中的机器人消掉,然后还会剩下若干个 Bi≥Ai 的,可以选择将其中一个变成 Ai+1 然后会摧毁 。因此最后的策略就是选择一个 Bi≥Ai 将 Bi 变成 Ai−1 然后会多出来 Bi−Ai+1 个球,Ai 直接覆盖了所有前缀,剩下的个数就是 Bi−Ai+1 和在 Ai 之后的球个数取 max。
时间复杂度 O(nlogn)。
D:整个序列形如一个二次函数,考虑枚举最小值位置,如有多个取下标最小的,则可以通过全局 +1,选择一个 j<i 让 aj,aj−1,…,a1 加上 1,2,…,至少给 i−1 操作次数,选择一个 j>i 当 aj,aj+1,…,an 加上 1,2… 。可以看作完全背包,直接做一个删除背包即可。有用的只有 O(√n) 种。
时间复杂度 O(n√n)。
E:先考虑执行区间操作,则后面的是 ∑|ai−bi|,而指定了 bi 考虑其差分,则所有 bi>0 的和就是区间个数,因此考虑一个 DP:fi,j=|ai−j|+min(fi−1,k+max(0,j−k))C。不难猜测 f 为凸函数,于是考虑 slope trick,先不考虑 |ai−j| 。考虑函数从 Fi−1(x) 变到 Fi(x) 的变化,找到最小值位置 p 显然 ≤p 的全部变成最小值,即斜率置 0,>p 的只有当斜率比 C 大时 (j−k)C+fi−1,k 的转移才有意义,然后将 ≤ai 斜率 -1,>ai 斜率 +1,不难发现所有斜率时刻都在 [−1,C+1] 之间。用一个 multiset 维护该过程就是:初始加入 c 个 0,每次加入两个 ai ,答案累加 ai− multiset 中最小值,删除最小最大值各一个。
考虑如何计数,只用对考虑到 i 时的 multiset 中最小值计数即可,根据套路可以枚举每一个值 v,若 x≤v 设为 0,否则设为 1 转成 01,设 dpi,j 考虑到前 i 个数,目前有 j 个 0的方案,转移显然。需要做 nK 次,因此时间复杂度 O(n3K)。
F:
AGC050
A:考虑每个点 x 连向 2x 和 2x+1 即可。
B:考虑如何判断给定的序列是否合法,显然只用关心每个 ximod3,因此等价于每次加入一个 012,120,201 或者删除。注意到删除操作一定不需要。则考虑如下递归过程:空串可以得到,三个位置 xi,xj,xk 满足 xj≡xi+1(mod3),xk≡xj+1(mod3) 且 [1,i),(i,j),(j,k),(k,n] 可以构造,则 [1,n] 可以构造。因此设 fl,r 表示区间 [l,r] 的最大贡献,按照上面的转移即可。时间复杂度 O(n3)。
C:Snuke 的状态可以看作一个二元组 (L,R),初始为 (∞,∞),每次可以将 (a,b) 变成 (min(a,b),0),而 Snuke 可以变成 (L−1,R+1) 或者 (L+1,R−1),注意到只要超过 log 个 B 是必胜的,因此 Snuke 赢的方式比较少,考虑什么时候 Snuke 会赢,考虑极长的 S 和间隔的 B,显然 B 不能连续出现,最后一个 B 之前没有限制,倒数第二个 B 之后至少要有一个 S,同理倒数第三个 B 之前应该有两个 S。因此考虑一个 DP:设 dpi,j 目前考虑到前 i 个字符,目前是第几个 B,转移就按照上面的转移即可。时间复杂度 O(nlogn)。
D:显然一个状态只由关注的人 x,当前位置 p,当前经过轮次 i,当前已经得到的人 j 。然后嗯转移即可,具体地,设 fa,b,c,d 表示当前完成 a 轮目前轮到 b,指定的人前面有 c 个人没有得到,后面有 d 个人没有得到。分类讨论转移即可。记忆化搜索时间复杂度 O(n4)。
E:
F:当 n 是偶数时暴力枚举第一次操作,否则会执行偶数次操作,则由于模 2,若存在两次操作可交换则答案为 0。不妨先让操作两两匹配,首先必须要有公共点,假设为 (x,y),(y,z),需要满足 cx≠cz 否则 NAND 结果相同。于是合并的方式可以换为:每次选三个点的链满足 cx≠cz 然后缩在一起权值任意。称得到的点为自由点,则如果自由点作为 y 时方案为 0,x,z 都是也为 0。否则假设 x 是则只能选择和 z 不一样的权值。因此规定一次操作要么没有自由点,要么有且 y 不能作为且 x,z 不能同时作为。且若一次操作后出现了两个以上的自由点则总有一个时刻要合并一定非法。于是最后的结构是初始产生一个自由点然后每次都是自由点作为 x,z 进行合并。枚举初始的 1 为 x 作为根,考虑每次合并的 (y,z) 写成一个序列,也就是一个拓扑序 a1,a2,…,an 要求 ca3=0,a2i 为 a2i+1 的祖先。然后很牛逼的是这两个条件都不必要,我们可以直接对该树的拓扑序计数。因为若两个不成父子关系直接交换抵消,如果 ca3=1 则和以 a3 为根的,第三个为 x 的方案抵消。因此贡献为 n!∏szi,容易换根对于 n 为奇数做到 O(n),n 为偶数做到 O(n2)。
AGC051
A:找一下规律发现答案为 (2nn)2。
B:因为 D≥10max(A,B,C),因此 A 中每看到一个点则会有至少 9 个点被挡住,考虑令 →i,→j,→k 分别表示和 A,B,C 看到的视角重合的向量(非空但不一定是单位向量),若集合 {a→i+b→j+c→k(a,b,c<10)} 没有重复元素则合法。实际上随机选出三个向量正确率极大,但是我们需要一个确定性算法,注意到 0 到 9 ,我们可以令三个向量为 10 的幂次,这样一定不存在重复的。
C:首先注意到每一列的奇偶性不变,每一行按照模 3 分组的奇偶性(一个三位二进制数)要么相同,要么相反。设 ai,bi 分别表示第 i 列和第 i 行的特征,可以证明如果一个矩阵的 a 和原来相同,每一个 bi 要么和原来的相同,要么相反则一定可以被构造出来。先考虑 a,b 都固定如何最小化 1 的个数。我们继续猜测答案的下界,对模 3 的每一组求出 ∑ai 和 bi 中该位的和,它们的 max 之和,还要满足它们模 2 同余。证明略。因此问题转化为有三个常数 A,B,C,n 个三维向量,可以翻转若干个向量,最小化 ∑max(x,X)。考虑一个调整法,则 (0,0,0),(0,0,1),(0,1,0),(0,1,1) 对其影响可以求出,其中第一种贡献比较特殊最多操作一次。后面三种翻转只会用到一种。因此模拟一下即可。
时间复杂度 O(n)。
D:转化为欧拉回路计数,套用 BEST 定理求解即可。
E:
F:
AGC052
A:
B:考虑随便找一个点当根然后求出到根异或和,则原操作可以等价于交换一条边相邻两点权值。两个状态可以互相到达当且仅当二者的 f 要么相同要么都是异或一个相同的数 x。由于 n 为奇数因此可以直接求出来,然后直接判断是否合法即可。
时间复杂度 O(nlogn)。
C:首先和不能是 P 的倍数,然后不妨假设 1 是序列的众数(如果不是乘上这个数的逆元即可)。考虑一个贪心,先放 P−1 个 1,然后放了 a1,则下一次放 P−a1 个 1。因此最多能消耗的 1 的个数为 P−1+∑P−ai ,可以证明该条件为充要条件。于是 DP:设 fi,j 设长度为 i 的序列,非 1 数 ∑P−ai=j。发现 j 太大于是正难则反一下,即可。如果 n−i≥j+p 且 n−i≠j 则统计答案。然后还需要统计和为 p 的倍数的序列,设 gi=(p−1)i−gi−1 容易计算。
时间复杂度 O(n2)。
D:先求出 fi,gi 表示 i 为结尾 / 开头的 LIS。若 LIS 为偶数显然一定可以,否则若 LIS 的所有位置满足经过它的 LIS 长度 >mx2 则无解。否则一定有解。
时间复杂度 O(nlogn)。
E:考虑将字符串转化为一个数字序列其中 ai≡si(mod3) 且 |ai−ai−1|=1 容易发现只要 a1 确定就唯一确定。一次操作等价于将一个 ai+2 或 −2,同样把 t 的 bi 写出来后不难发现答案有下界 12(∑|ai−bi|)。且需要满足 a1≡s1,b1≡t1 a1≡b1,容易发现第一个条件让所有 ai≡bi(mod2) 成立,因此操作总是合法的,不难猜测答案一定能取到下界。注意到 a 序列可以唯一确定,b1=6k+b 其中 b≡b1(mod3),b≡a1(mod2) 可以直接计算,于是等价于有一个序列 c,需要选择一个 k 最小化 ∑|ci−6k| 容易发现 6k 取中位数附近的值最优,因此只需要 check 3 个可能的值即可。
时间复杂度 O(nlogn) 或 O(n)。
F:首先操作可逆,可以变成初始有一个全 1 的树能得到多少棵树。神秘结论:若树上存在一个点满足 deg≥3 且删掉后至少有两个子树 sz≥2。则 ”至少存在一个点其邻居和为奇数“ 和 ”有奇数个连通块“ 为某个状态合法的充要条件。
如果满足了就直接 DP:fu,a,b,c,d 表示 u 节点,u 颜色,u 黑色儿子个数,当前黑色连通块个数,当前不包括 u 是否存在合法点。转移带 28 的常数。否则树的形态很简单,就是一条链,链的端点有一些叶子,为了唯一计数不妨设 x,y(x,y≥1)。则分类讨论两个端点是否为黑色:
- 若都是黑色,x+y 个叶子随便选或不选,链上必然全选,否则拼不起来。
- 若某一段为黑色,该端点叶子随便选,链上黑色一定是包含该端点的一个区间,另一个端点必然有偶数个被选。
- 若都不是黑色,也必然是链上只有一个区间为黑色,链上都是偶数儿子。若链上都是白色,则两个端点必须恰好有一个点能选。
时间复杂度 O(n)。
AGC053
A:
B:
C:
D:
E:不妨假设 ai<bi,则 ai 不可能成为 peak。若要使得 peak = n - 1,必然是 (ab)(ab)…(ab),或者 (ab)(ab)…(ab)(ba)…(ba)。
因此可以写出一个 pi 合法的充要条件为 ∃k∈[0,n],∀i∈[1,k−1],使得 bi>ai+1 ,∀i∈[k+2,n],使得 bi>ai−1。
考虑找到最小的 bi<ai+1 的位置,直接令 k=i 即可,此时 bi<ai+1<bi+1 ,因此 abba 的峰在右边。
考虑分开统计两种贡献,按照 b 从小到大排序,从大到小加入元素,插入 i, 的方案为 ∑i<j[bi>aj]+1。BIT 统计。
否则枚举 aj>bi 的 i,j ,预先把 i,j 加入 BIT,同样从大到小枚举元素统计 ∏(∑[bi>aj]) 即可。暴力统计 O(n3logn)。
预处理 ti=∑j>i[bi>aj]+1
当 p>j 时,贡献为 t+2,当 i<p<j 时,贡献为 t+1,否则贡献为 t,因此 (i,j) 的总贡献为 (∏p<itp)(∏i<p<j(tp+1))(∏p>jtp+2)。
同样可以树状数组统计。时间复杂度 O(nlogn)。
AGC054
AGC055
AGC056
AGC057
Yui and Mahjong Set
倒序问出 n−1 到 3,如果 ai≥1 则可以直接根据 triple 得到,否则无法判断其为 0 或者 1。最后分别问 1, 2, 1,可以得到 a2(a3+1),(a1+a4+2)(a3+1),(a2+1)(a3+1) 得到 a1,a2,a3,然后根据 3−n−1 得到 4−n。恰好询问 n 次。
Make It Ascending
DP,最后一定是有若干个集 Si,存在递增的下标 pi∈Si,且 sumi<sumi+1,直接对这个 DP 即可。设 fS,i,j 表示当前放了集合为 S,目前 p=i,个数为 j 的最小的最后一个集合的和。时间复杂度 O(3nn2)。
本文作者:henrici3106
本文链接:https://www.cnblogs.com/henrici3106/p/16386890.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)