刷题记录

解题情况:当天期望思考题数/实际思考题数/实际过题数

题解基本靠口胡,AC 记录随缘留。

总共的解题情况:53/51

2020.10.21

解题情况:4/4/3

[AGC034F]RNG and XOR:写过,写过题解。

[CF594E]Cutting the Line:偏题,难题,写个伪算法丢这里先。WA on Text 2

[AGC030D]Inversion Sum:每个逆序对可以拆开考虑,那么用 (f(k,i,j)) 表示前 (k) 次操作后, (A_i<A_j) 的方案数。转移每次只会影响到 (O(n)) 个值,剩下的值都是乘 2 ,可以打标记。时间复杂度 (O(nq))

[AGC038E]Gachapon:先来 min-max 容斥,一个子集的贡献可以直接统计高维空间中第 (i)(le B_i) 的每个点的贡献;显然可以 DP ,如果用向量表示一个点,那么就只需要统计向量中被考虑了的位置的 (A) 的和与向量坐标之和,其余的东西都可以在转移中计算。时间复杂度 (O((sum B)^2 imes (sum A)))

2020.10.22

解题情况:4/4/4

*[AGC034D]Manhattan Max Matching考虑 (|a-b|=max{a-b,b-a}) ,因此:

[|x_i-x_j|+|y_i-y_j|=max{x_i-x_j+y_i-y_j,x_i-x_j-y_i+y_j,-x_i+x_j+y_i-y_j,-x_i+x_j-x_i+y_j} ]

因此每个点有 4 种贡献,分类到不同的中转点上去连边,最后跑一个最小费用流。

[ARC060E]Tak and Hotels:贪心地想,走一天肯定尽量将一天能走的距离走满。于是走一天到达的酒店是确定的,于是预处理走一天能到达的酒店,之后可以倍增,查询的时候二分,用倍增数组检查。时间是 (O(nlog_2^2n))

[ARC060D]Best Representation:写过,题解在洛谷博客上。

[ARC061C]Snuke's Subway Trip:拆点,之后跑最短路。在同一个站内不需要暴力相互连接,可以建立一个集中点。但是这样边权就会有 0 和 1 两种,需要用到双端 BFS 。

2020.10.23

解题情况:4/4/3

*[ARC061D]Card Game for Three:可以发现,本题中游戏局面和一个长度为 (n+m+k) 的卡牌序列是一一对应的,所以我们只需要对合法的长度为 (n+m+k) 的卡牌序列进行计数。 那么一个序列合法等价于对于第一个 (p) 使得 ([1,p]) 中 a 的个数 (ge n) ,必须有 ([1,p]) 中 b 和 c 的个数分别 (<m,k) 。所以合法序列数量如下:

[sum_{i=n}^m3^{n+m+k-i}inom{i-1}{n-1}sum_{j}[0le jle m][0le i-n-jle k]inom{i-n}{j} ]

(以下内容是得到提示后思考出的)考虑优化第二个求和符内的运算。显然我们可以直接 MTT 计算我们可以在杨辉三角中,将用到的位置画一下。这是 (m=2,k=5) 的情况:

'*'表示用得到,'.'表示用不到
0 *
1 **
2 ***
3 ***.
4 ***..
5 ***...
6 .**....
7 ..*.....

可以利用组合数的加法公式将两行之间的转移优化成 (O(1)) 的。时间复杂度是 (O(n))

[ARC063F]Snuke's Coloring 2:思考 40min 后无果,暂时只得到 (O(n^2log_2n)) 的暴力。ACx15,WAx1,TLEx41

*[ARC063E]Integers on a Tree:考虑无解,要么是两个点之间的边数小于差值-1,要么是两个点之间边数与差值奇偶性不同。如何快速检查?我们可以每次取出最小的点,并将它的邻接点全部设成当前点权 +1 ,最后检查。这样如果两个点之间的距离不够,那么得到 No 。如果两个点之间的距离足够,那么它们就会在值相等之后从两端靠拢,此时就能比对奇偶性。本题的值域很小,所以可以直接用 vector 模拟优先队列,时间 (O(n))

*[ARC064F]Rotated Palidrome:不难想到枚举最小循环节长度,那么此时的贡献为循环不同构的回文串个数乘以循环节长度。可以发现,循环节内也是一个回文串,一个回文串不存在循环同构的回文串,它只能是奇串,而偶串正好有一个与它循环同构。于是我们只需要考虑最小循环节下的不同回文串。由于直接枚举会算重,所以需要容斥。

2020.10.24

当天模拟赛,刷题先暂停。

2020.10.25

解题情况:4/7/7

[ARC065E]Manhattan Compass:考虑将曼哈顿距离转成切比雪夫距离,这样就可以飞快地查询距离某个点为定值的点的个数(正方形边界)。此外,我们还需要找出哪些点可以到达,这个可以 BFS 加上 set 维护剩余点解决。

[ARC065F]Shuffling:首先,如果存在区间 ([l_i,r_i]subset [l_j,r_j]) ,那么 ([l_i,r_i]) 的操作可以被忽视。我们可以把有用的区间单独提出来。如果有多个相同区间,需要只留一个。那么,此时再按左端点排序,就一定有 (forall i,l_i<l_{i+1},r_i<r_{i+1}) 。所以操作 (i) 结束后,([l_i,l_{i+1})) 这段区间就不会被修改。因此可以设状态 (f(i,j)) 表示前 (i) 个有意义区间操作完后, ([l_i,r_i]) 中剩余 (j) 个 1 的方案数。转移需要讨论 (r_i) 是否大于等于 (l_{i+1}) 。时间是超小常数 (O(n^3))能过的欸

*[ARC066D]Xor Sum:首先可以直接打表找规律解决本题发现 (a+b=aoperatorname{xor} b-2(aoperatorname{and}b)) 。接着就有一个不那么常规的数位 DP 。考虑 (f(i,j)) 表示 (ule i,vle j) 时候合法的 ((u,v)) 方案数。则可以枚举 (a,b)最低位的情况,得到转移:

[f(i,j)=f(lfloorfrac{i}{2} floor,lfloorfrac{j}{2} floor)+f(lfloorfrac{i-1}{2} floor,lfloorfrac{j-1}{2} floor)+f(lfloorfrac{i}{2} floor,lfloorfrac{j-2}{2} floor) ]

状态数很少,用表存。

[ARC067F]Yakiniku Restaurants:设 (s_i=sum_{j=1}^{i-1}A_j) ,那么原题等价于求:

[max_{1le lle rle n}{sum_{i=1}^mmax_{lle kle r}{B_{k,i}}-s_r+s_l} ]

于是可以考虑枚举左端点 (l) ,动态地维护所有右端点的贡献。将 (l)(1)(n) 推过去,就像是在倒着做从后往前的单调栈;根据单调栈的过程,整个过程中总共会有 (O(nm)) 个区间的 (max{B}) 会被修改,直接线段树。时间是 (O(nmlog_2n))

[ARC069E]Frequency:贪心策略显然是每次移动石子最多且排位最后的石子堆,于是当石子堆数量降级之后才会出现改变,排序之后模拟即可。

[ARC068E]Snuke Line:对于纪念品区间 ([l_i,r_i]) ,当 (dle r_i-l_i+1) 的时候,它必然会贡献,因此可以在答案上差分;否则,我们可以给整个 ([l_i,r_i]) 区间 +1 ,并且用调和级数的复杂度来统计贡献。时间复杂度是 (O(mlog mlog_2n))

*[ARC066E]Addition and Subtraction Hard:显然我们的左括号只能放在 - 的旁边。一个括号内部的 + 除了第一段连续的意外,其余的都可以和 - 结合而不变,也就是长这样:

[-(a+b+c-(d+e+f)-g-(h+k)) ]

注意到 (-(a-(b+c))=-(a-b)+c) ,所以两个右括号合在一起的情况可以避免。

那么最多就两层括号,于是可以 DP 。状态为 (f(i,j)) 表示前 (i) 个数,此时有 (j) 层括号的最大和,转移略。

2020.10.26

解题情况:5/4/4

[ARC070B]No Need:做一个范围为 (2k) 的背包 DP 。如果 (a_ige k) ,我们直接将它看作 (k) 。在判断 (i) 是否必要的时候,我们可以 (O(k)) 将 DP 中它的贡献去掉。剩下的,我们直接判断 (sum_{kle j}f(j)) 是否等于 (sum_{max{k-a_i,0}le j}f(j)) 就好了。注意到此时我们的取模本质上是在哈希,所以最好多哈希保险。

*[ARC070C]Narrow Rectangle:首先可以考虑 DP ,设 (f(i,j)) 表示前 (i) 个矩形操作完后,第 (i) 个矩形此时左边在 (j) 这个位置的最小移动花费,转移显然:

[f(i,j)=max_{j-(r_{i-1}-l_{i-1})le kle j+(r_{i}-l_{i})}{f(i-1,k)+|l_i-j|} ]

考虑(f(i,j)) 看作是关于 (j) 的函数,那么不难发现 (f(i,j)) 为关于 (j) 的一次分段函数,且斜率由左到右分别为 (-i,-i+1,dots,-1,0,1,dots,i-1,i) (中间可能有的斜率的区间长度为 0 ),于是可以考虑维护斜率的拐点。

可以发现 (f(i,x)) 必然是单调递增的,于是取 (max) 就相当于将斜率 (<0) 的部分全部向左移动 (r_i-l_i)(>0) 的部分全部向右移动 (r_{i-1}-l_{i-1}) ,这个可以将拐点分成两部分,并直接记录移动距离。

接着考虑如何叠加 (|l_i-j|) 。此时设斜率 (<0) 的最右边的一个是 (x)(>0) 最左边的是 (y) ,于是全 0 的一段是 ([x,y]) ,分类讨论:

  1. 如果 (l_i<x) ,那么 ((-infty,l_i]) 这里的斜率都会 -1 ; ((l_i,+infty)) 这里的斜率都会 +1 ,此时 ([x,y]) 斜率变成正的。所以修改就相当于(x) 归入到右半部分,并且在 (l_i) 的位置插入两个拐点
  2. 如果 (xle l_ile y) ,那么就相当于全零的段不见了,随之而来的是 (l_i) 成为了拐点,需要加到左右两个部分中
  3. 如果 (y<l_i) ,请参考之前的分析。相当于是将 (y) 归入了左半部分,并在 (l_i) 的位置插入两个拐点。

于是我们可以用大根堆维护左半部分,小根堆维护右半部分,同时维护平移的距离。时间复杂度是 (O(nlog_2n))

*[ARC102E]Stop. Otherwise...:;

[ARC100E]Or Plus Max:;

2020.10.27

解题情况:5/4/4
[ARC100D]Equal Cut:考虑枚举第二段的终点,那么第一段和第二段的差的绝对值尽量小,第三段和第四段的差的绝对值尽量小,这样就可以直接用两个指针维护一下。注意要判断第一段、第二段和第三段、第四段的大小关系。

[ARC098E]Range Minimum Queries:考虑枚举值的边界 (V) ,我们只删除 (ge V) 的元素。于是在操作的时候,我们选择的区间就不能包含不删除的元素。那么对于一个长度为 (l(lge K)) 的只包含可删除元素的区间,它就能给我们贡献 (l-K) 个可删除元素,显然我们应该选取其中的前 (l-K) 大。把所有这样的区间中的可删除元素找出来,就可以计算这种情况下的答案,最后对所有情况取 (min) 即可。

*[ARC096E]Everything on it:;

[ARC097F]Monochrome Cat:树形 DP ,两个状态,用堆维护,然后没了

2020.10.28

出现了模拟赛

2020.10.29

解题情况:2/1/1

[ARC095E]Symmetric Grid:可以发现 " 中心对称 " 本质上就是行和列的配对。先考虑行配对,这个可以搜索;再考虑列配对,还是可以搜索,顺便可以利用行配对信息来剪枝。时间是 (O( extrm{能过})) 。注意判断奇数边长的自配对情况。

2020.10.30

解题情况:5/4/4

*[AGC024F]Simple Sequence Problem:首先考虑建立序列自动机。当然,不可能给每个串一个一个地建出来。注意序列自动机的边本质上是指向了原串的一个后缀,所以我们实际上可以对可能出现的 (2^{n+1}-1) 个串建立起 " 广义 " 序列自动机。

接着我们可以枚举结果串 (t) ,并且对 (S) 中的所有点暴力跑,最后看有多少个有效节点。这样当然会 T 。

考虑优化。如果现在有两个重合节点,我们当然可以把它们当作一个节点来跑,只需要记录出现次数就行了。这样就能起到极大的优化作用,时间复杂度是 (O() 大概 (n2^n) 反正能过 ())

*[ARC094D]Worst Case我最弱的题型。假设 (A<B) ,分类讨论再构造:

  • (A=B),那么每个人必然有一场比赛的排名 (<A) 。那么两场中的 ([1,A))((A,2A]) 可以分别匹配,最多有 (2A-2) 对。
  • (A+1=B),那么每个人还是必然有一场的排名 (<A) 。第一场的 ([1,A)) 可以和第二场的 ((B,2A]) 匹配;第二场的 ([1,A)) 可以和第一场的 ((A,2A]) 匹配。同样是 (2A-2) 对。
  • 剩下的情况中,考虑 (C) 是满足 (C^2<AB) 的最小数,于是有 (Ale C<B) 。我们首先可以让第一场的 ([1,A)) 和第二场的 ((B,A+B)) 进行配对。此时需要分类:
    • 如果 (C(C+1)ge AB) ,那么一个人要胜过 Takahashi ,要么在第一场中夺得前 (C-1) 名,或者在第二场中夺得前 (C) 名。于是我们就可以将 ((A,2C))([1,2C-A)) 中的来匹配。总共有 (2C-2) 对;
    • 如果 (C(C+1)< AB) ,那么一个人要么在第一场中夺得前 (C) 名,要么在第二场中夺得前 (C) 名。类似的,我们得到 (2C-1) 对。

*[ARC099E]Independence:完全图很难处理,我们考虑将完全图转化为它的补图。这样原题的限制就相当于将补图二染色,并且任意一条边的两个顶点的颜色不同。显然结果仅与某种颜色的点数相关,且一个连通块内染色的点数是确定的。于是可以对于每个连通块分开处理,最后用一个 DP 将连通块通过选择颜色合并起来。时间是 (O(n^2))

*[ARC098F]Donation:;

2020.10.31

再次出现模拟赛

2020.11.01

解题情况:5/4/4

*[ARC094F]Normalization:给定一个串 (T) ,我们需要思考如何判定 (T) 是否能由 (S) 转化来。可以发现合法的 (T) 满足:

  • 要么 (T=S)
  • 要么 (T ot=S) ,此时还需要满足:
    • (S) 必须有至少一对相邻字符是不同的。
    • (T) 必须有至少一对相邻字符是相同的。
    • 如果将 a,b,c 分别看成 0,1,2 ,那么 (T)(S) 的和必须 (mod 3) 同余。

然后我们就可以直接 DP 了。记得特判 (|S|le 3) 时的答案。

[ARC097E]Sorted and Sorted:考虑直接构造最终的序列并计算移动的次数。可以直接定义状态 (f(i,j)) 表示放了 (i) 个球,其中 (j) 个是前 (j) 个白球正序放置的最小代价。我们钦定一次交换会被编号较小的那一个记录。转移的时候,枚举一下放的球的颜色,我们还可以知道球当前的位置,转移即可。 AC 记录

*[ARC093E]Bichrome Spanning Tree:考虑在任意染色方案中,在最小生成树上换边使得它有两种颜色,显然我们只会选取使得总和增长最小的一条边进行替换。这就告诉我们,我们最多只会替换一条边。那么设 (D)(X) 与最小生成树权的差值。讨论 (D>0) 时,我们需要让最小生成树和增长小于 (D) 的边全为同色,再让增长恰为 (D) 的边至少有一条为不同色,最后让增长大于 (D) 的边随便涂,方案的计算很简单;对于 (D=0) ,我们还需要考虑让最小生成树本身包含两种颜色的方案数,算起来也很简单。 (D<0) 无解。时间理论上可以做到 (O(nlog_2n))

[ARC067E]Grouping:不难想到枚举不同大小的集合,然后进行 DP 。设状态 (f(i,j)) 表示考虑完大小为 ([A,A+i-1]) 的集合后,安排了 (j) 个人的方案数。转移显然:

[f(i,j)=f(i-1,j)+sum_{k=C}^{D}[kile j] f(i-1,j-ki) imes inom{j}{ki} imes frac{(ki)!}{(i!)^kk!} ]

最后一个 (frac{(ki)!}{(i!)^kk!}) 是首先考虑将 (ki) 个人划分到 (k) 个大小为 (i) 的集合中的方案数,然后要对 (k) 个集合去序。

转移就相当于做了 (n) 次调和级数,时间复杂度为 (O(n^2log_2n)) 。记得优化掉转移的快速幂时间。

2020.11.02

解题情况:5/5/5

*[ARC096F]Sweet Alchemy:首先,根据 (c_{p_i}le c_ile c_{p_i}+d) 这个条件,我们可以知道, (c) 是外向单调递增的,于是可以做一个树上差分,每个节点 (u) 现在变成了有对应的代价 (w_u)(子树 (sum m) ) 和贡献 (v_u) (子树大小),且每个节点最多选 (d) 次。这是特殊多重背包问题,直接来肯定不行。

考虑一个最初的贪心算法:按照性价比 (frac{v}{w}) 来排序。贪心的问题在于,物品的性价比高不代表它就能被放进去。但是我们可以思考,什么时候性价比高的物品,会替代性价比低的。考虑 (i,j,frac{v_i}{w_i}>frac{v_j}{w_j}) ,假如我们选取了 (v_i) 个物品 (j) ,选取了 (v_j) 个物品 (i) ,那么它们的贡献是相同的,即 (v_iv_j) 。但是,当我们选取了 (v_i) 个物品 (j) 的时候,我们显然可以将它换作 (v_j) 个物品 (i) ,更加划算。因此,我们知道了,当存在性价比更高的物品的时候,我们能选的 (j) 不会太多,可以取一个上界 (n) 。于是我们可以对每个物品,取出 (min{n,d}) 件来进行多重背包(将选取数量作为状态里),剩下的就可以直接贪心了。

*[ARC093F]Dark Horse:首先固定 1 在 1 号位上。将序列划分成 (n) 段,第 (i)(I_i=(2^{i-1},2^i]) ,原题等价于使得任意的 (I) , (min{I} otin {A_1,A_2,...,A_m}) 。于是不难考虑容斥;求容斥方案的过程的问题在于,确定最小值后,能选取的数的个数不太好确定,那么就 DP 有序处理。考虑 (f(i,S)) 表示 (A_isim A_{m}) 的数都处理完后, (S) 中对应的区间的最小值都被确定了的方案数。转移比较简单,略。之后求出 (2^nsum_{S} (-1)^{|S|}f(1,S)) 即可。

-[ARC107F]Sum of Abs:数据比较小,考虑网络流。如果正向做,那么显然不方便,于是我们考虑转化成最小割。首先注意 (|a|=max{a,-a}) ,那么 (|sum B|=max{sum B,sum -B}) ,这就意味着同一个连通块里的 (B) 需要取同一个符号。

(以下用 (aoverset{c}{ ightarrow} b) 表示有一条从 (a)(b) ,容量为 (c) 的边)

接着考虑建图,首先初始值为 (sum |B|) 。接着拆点,对于 (u) ,建立 (u,u') 。那么割掉 (Soverset{}{ ightarrow} u) 就代表选正号, (uoverset{}{ ightarrow}u') 就代表删点,割掉 (u'overset{}{ ightarrow} T) 就代表选负号。于是对于 (Bge0)(u) ,需要连接 (Soverset{0}{ ightarrow} u,uoverset{A_u+B_u}{ ightarrow} u',u'overset{2B_u}{ ightarrow}T)(B<0) 的时候可以类似地操作。

最后考虑边的限制。对于 ((u,v)) 这条边,如果 (u) 割掉了 (u' overset{}{ ightarrow} T) ,那么 (v) 就不能割 (Soverset{}{ ightarrow}v) ,反过来也一样。于是不难想到连接 (u'overset{+infty}{ ightarrow}v,v'overset{+infty}{ ightarrow}u) 。跑个网络流,结束。

-[ARC107E]Mex Mats:找规律吧......会发现,对于任意的初始行列,生成了 4 行 4 列后,剩下的矩形的对角线上的元素都是一样的了,直接计算即可。

[ARC092D]Two Sequences:枚举每一位,然后计算有多少对会在当前位上产生 1 。首先对于 (A) 序列中的数,按照当前位分成 (A_0)(A_1) 。接着枚举 (B) ,例如当前位为 0 ,那么就需要查找 (A_0) 中会产生进位的数和 (A_1) 中不产生进位的数。这两个都可以排序之后在序列上进行二分。时间是 (O(nlog_2^2n))

2020.11.03

解题情况:5/5/5

[ARC092E]Both Sides Merger:首先发现,在原序列中下标奇偶性不同的元素这辈子都不可能加在一起。那么考虑能否让下标奇偶性相同的正数全部加起来?显然是可以的。以奇数为例,找到第一个和最后一个下标为奇数且为正的元素,分别设它们的下标为 (l,r) 。那么 ([1,l))((r,n]) 都应该被删除。接着,忽略负数,考虑内部两个下标为奇数且相邻的正元素。那么我们就可以通过合法操作,让它们之间只有一个元素,最后将两个合并起来。按照上述模拟即可。时间理论可以 (O(n))不过你写 (O(n^2)) 也没人会发现的

[ARC091D]Remainder Reminder:枚举 (b) ,计算可能的 (a) ,时间可以做到 (O(n)) ,当然用 (O(nlog_2n)) 也是可以的。

*[ARC088D]Wide Swap考虑 (S) 中的一个位置 (k) ,使得 (S[k] ot= S[k+1]) ,那么我们就必须在这之间进行一次翻转,此时最小区间长度必须 (le max{k,n-k}) 。找出所有这样的位置并最后取 (min) 即可。

[ARC090E]Avoiding Collision:直接用总方案数减去不合法方案数。不合法只需要考虑两种情况,一种是在点上,需要判断是否能在点上相遇,以及最短路是否会经过点;另一种是在边上,需要判断能否在边上相遇,以及最短路是否会经过边。

[ARC087E]Prefix-free Game:首先可以把问题转化到 Trie 上,此时每次添加就必须新建 " 枝桠 " ,并且不能是已有结束节点的儿子。可以发现,每个博弈区域(即空儿子)是独立的,于是考虑 SG 函数简化运算。稍微推一下可以发现,我们只需要考虑空树的 SG 的函数,单链的 SG 可以用 Multi-Nim 转化成空树,空树的 SG 与高度相关。于是记 (SG(n)) 为高度为 (n) 的空树的 SG 值,有递推式:

[SG(n)= egin{cases} 0&n=0\ 1&n=1\ operatorname{mex}({0}cup{igoplus_{j=1}^{i}SG(n-j)|1le i< n})&otherwise end{cases} ]

找一下规律发现 (SG(n)=operatorname{lowbit}(n)) ,于是就可以 (O(nlog_2L)) 解决了。

2020.11.04

解题情况:5/4/4

*[ARC088E]Papple Sort:显然,判断一个串能否变成回文串是很容易的。对于同样的字符,它们肯定是从内到外依次匹配。因此最终每个字符对应的字符是确定的。那么考虑两组配对的字符,如果它们不是包含关系,那么它们之间必然需要交换来成为包含关系;否则就不应该调换内外关系。归纳一下就等价于,将每组字符按照左字符从小到大确定最终位置即可。最后求逆序对数就是答案。

*[ARC091F]Strange Nim:可以发现每一堆石子是独立的,因此求一下 SG 函数。设 (SG_k(n)) 表示有 (n) 个石子的石子堆,每次最多拿 (lfloorfrac{n}{k} floor) 个石子的 SG 函数值。通过找规律,可以发现:

[SG_k(n)= egin{cases} frac{n}{k}&nequiv 0pmod k\ SG_k(lfloorfrac{(k-1)n}{k} floor)&otherwise end{cases} ]

经过一系列变换可以将 (otherwise) 的部分变成:

[SG_k(n)=SG_k(n-lfloorfrac n k floor-1) ]

于是可以考虑,对于 (lfloorfrac{n}{k} floor) 相同的部分,我们就直接跳过了。设 (lfloorfrac n k floor=d) ,那么当 (nge dk) 的时候,(lfloorfrac n k floor) 都是定值,我们可以直接做;同时注意判断 (n) 是否会恰好跳到 (dk) 去。考虑复杂度,对于 (d) ,它有少于 (frac{n}{k}) 种取值;对于 (n) ,它每次乘一个小于 (frac{k-1}{k}) 的因子,每 (k) 步这个值约为 (frac{1}{e}) 。时间是 (O(min{frac n k,klog n})=O(sqrt{nlog n}))

[ARC088F]Christmas Tree:问题等价于将边划分成链,使得链之间边不交,且链数最小的前提下每条链的长度的最大值最小。第一个问题可以直接计算,即奇数度数的点的数量除以二。第二个问题类似于 NOIP2018 赛道修建,直接二分答案。此时每个奇度点必须自己内部消化完,偶度点必须剩一个返回。我们希望返回的链最短,可以发现这个仍然可以二分,检查可以直接尝试匹配。于是就解决了。

*[ARC087F]Squirrel Migration:考虑答案的上界,对于边 ((u,v)) ,它的最大贡献是 (2min{siz_u,siz_v}) 。考虑如何达到最大贡献。如果原树有两个重心,那么就可以直接让重心割开的两部分互相对换,方案是 (((frac{n}{2})!)^2) 。如果只有一个,那么把重心割开,我们就有了很多个连通块,这就相当于每个点最终不能回到自己的连通块。这个比较简单,可以 DP + 容斥原理计算。

2020.11.05

解题情况:3/1/1

开始复习 CSP 的相关知识了。

*[ARC092F]Two Faced Edges:考虑一条边 ((u,v)) ,它在强连通分量中等价于 (v) 可以到 (u) ,它的反边在强连通分量中等价于存在一条从 (u)(v) 且不经过 ((u,v)) 的路径。那么第一个问题可以直接 DFS 解决。

第二个问题,我们只需要考虑,从 (u) 出发是否必须要经过 ((u,v)) 才能到达 (v) ,也就是,经过其它边是否能到达 (v) 。考虑按照 (u) 的邻边的加边时间进行遍历,并在到达一个点的时候,记录从 (u) 出发时经过的边的编号,记为 (d)。那么 (d(v)) 就能判断在不晚于 ((u,v)) 加入的边中, (u) 是否能不通过 ((u,v)) 而到达 (v) 。颠倒顺序再来一遍,我们就可以判断了。时间是 (O(nm)) .。

2020.11.09

解题情况:4/1/1

*[ARC100F]Colorful Sequence:(容斥,DP,略)

原文地址:https://www.cnblogs.com/crashed/p/13852240.html