Codeforces 打+VP 记录

CF 1662 Partial Round VP on 9.17

A.Organizing SWERC

模拟

C.European Trip

如果不要求是special trip,那么直接求邻接矩阵 \(M^k\) 的对角和即可。

考虑 \(k=2\) 时的转移,发现只要减去一个度数矩阵 \(Deg\) 即可,原因显然。然而当 \(k>2\) 时却并不是这样,因为在所有情况中存在一种已经从答案中剔除了(即倒数第二三条边相同),于是得到答案矩阵 \(G(k)\) 的转移式:

\[G_k=G_{k-1}\times M-G_{k-2}\times (Deg-E) \]

这是一个线性递推式,考虑用矩阵快速幂优化矩阵

\[\begin{bmatrix} M&-(Deg-E)\\ E&O \end{bmatrix} \times \begin{bmatrix} G_{k-1}\\ G_{k-2} \end{bmatrix} = \begin{bmatrix} G_k\\ G_{k-1} \end{bmatrix} \]

D.Evolution of Weasels

手玩一下发现:\(AB\to AAABBB\to ABBBBB\to ABAAAA\to ABABBA\to BA\),对 \(C\) 同理。

又因为去掉 \(B\) 后等同于消去 \(AA(CC)\),于是得到 \(B\) 的位置是任意的,而 \(A,C\) 则无法改变。因此先判 \(B\) 的奇偶性是否相同,然后在 \(S,T\) 中不断消去 \(AA,CC\) 即可。

E.Round Table

考虑增量法求解:首先 \(1,2\) 无需考虑,设当前已经确定了 \(1\sim i-1\) 的相对位置,考虑插入 \(i\),手玩发现要使得 \(i\) 处于正确的位置,那么 \(i-1\)\(i\) 在排列 \(p\) 中的位置之间每有一个小于 \(i\) (除 \(i-1\) 外)的数,都需要将 \(i\sim n\) 往后推一遍使得 \(i\) 与这些数的相对位置正确,于是这一步的贡献就是 \((n-i+1)\times c_i\)\(c_i\) 表示满足上述条件的数的个数)。通过从小往大扫描并用树状数组维护容易求得答案。

那么定义答案函数为 \(F(n)=\sum\limits_{i=3}^n(n-i+1)\times c_i\),考虑每次交换操作对答案的影响:首先从 \((p_1,p_2,\dots,p_n)\) 变换为 \((1,2,\dots,n)\) 与原问题等价,若 \(p_i>p_{i+1}\),则交换后会使得 \(c_i\)\(1\)\(c_{{p_i}+1}\) (注意这个 \(+1\) 在上面)减 \(1\),于是答案的变化量就是 \(\Delta F(n)=|(n-p_i+1-1)-(n-p_i+1)|=1\),反之亦然。于是让每次操作都为 \(-1\) 即为最优方案,答案就是 \(F(n)\)

F.Antennas

拆绝对值并分类讨论发现是一个势能线段树优化最短路的板子,但根据套路直接连边会MLE,于是直接在线段树上更新即可。

I.Ice Cream Shop

考虑强制要某个顾客,那么预处理出每个顾客对应的小贩然后在两边分别找到最优位置计算最大的价值。

L.Il Derby della Madonnina

拆绝对值并分类讨论发现是一个势能线段树优化最长路的板子,但根据套路,不可能两次踏入同一条河(Dijkstra无法跑最长路,而SPFA是假的)。考虑另一种形式:

\[|a_i-a_j|\le v\times(t_i-t_j)\rightarrow v\times(t_j-t_i)\le a_i-a_j\le v\times(t_i-t_j) \Leftrightarrow \begin{cases} v\times t_i-a_i\ge v\times t_j-a_j\\ v\times t_i+a_i\ge v\times t_j+a_j \end{cases} \]

这是一个LIS问题,用树状数组维护。

N.Drone Photo

显然一个子矩形要么合法要么不合法,对于合法的情况,发现无论怎样都恰好有一个点大于旁边两个点,而对于不合法的情况,发现恰好有两个点大于旁边两个点,于是可以对每个点计算出贡献的矩形数,求其和,设为 \(sum\),总矩形数设为 \(cnt=(\frac{n\times(n-1)}{2})^2\),合法矩形设有 \(x\) 个,不合法设有 \(y\) 个,鸡兔同笼列出方程:

\[\begin{cases} x+2y=sum\\ x+y=cnt \end{cases} \]

解得 \(x=cnt\times 2-sum\)

CF 1704 VP on 9.21

A.Two 0-1 Sequences

首先 \(S\) 的最后 \(m-1\) 位必须与 \(T\) 相同,然后从第 \(n-m+1\) 位开始往前搜,能满足要求就返回true

B.Luke is a Foodie

考虑拆绝对值后合法的 \(v\) 是一段区间,那么算出这个区间,同时维护当前 \(v\) 可取的区间左右端点,如果无法满足就 \(ans++\) 并更新端点。

C.Virus

贪心地选最长的区间来保护,注意如果不能保护整个区间,但能保护一个还是要保护的。

D.Magical Array

\(F(x)=\sum\limits_{i=1}^mi\times C_i\),发现进行操作 \(1\) 不会改变其值,而每进行一次操作 \(2\) 就会使\(F(x)+1\),因此找到最大的那个并输出与其他的差即可。

E.Count Seconds

发现这个东西很像拓扑排序的过程,但是由于汇点无法流出点权,所以不能直接做。

但是如果所有点的点权都流到了汇点那就没事了,因为这样就能保证最后汇点的点权可以直接排出。易知最多流 \(n\) 轮就能满足条件,于是暴力进行这个过程,然后做一遍拓扑就行了。注意特判 \(n\) 轮之前已经结束的情况

F.Colouring Game

显然如果拥有颜色数不相等时多的一方是必胜的,因为只要把与另一种颜色相邻的方块扔掉就行了。

于是首先去掉相邻异色的,然后套上 \(SG\) 函数即可。

然而这样做是 \(O(n^2)\) 的,但是如果打一下表放到OEIS上就能发现有个 \(34\) 的循环节,于是就变成 \(O(n)\) 的了。

G.Mio and Lucky Array

神仙构造 \(+FFT\) 爬。

H1/2.Game of AI

\(EGF+FFT\) 滚一边去。

CF Round #822 (Div. 2) on 9.23

A.Select Three Sticks

差分序列相邻两项和的最小值。

B.Bright,Nice,Brilliant

输出一个金字塔,除每行第一个和最后一个为 \(1\),其余均为 \(0\)

C.Removing Smallest Multiples

从小到大枚举倍数删,如果已经删过了就不删,否则删到该项不能删为止。

D.Slime Escape

考虑两侧形成了若干个全正和全负的连续段,发现如果吃掉一些段有收益则一定要吃,于是维护当前向左和向右的最近的能得到收益的位置,如果能吃就吃过去,注意特判无收益但已经可以逃离的情况。

E.Rectangular Congruence

发现对于一个满足条件二的矩阵,在同一行或同一列加上一个相同的数都仍然满足,考虑 \(a_{i,j}=i\times j\),容易发现这个矩阵满足条件二,于是在每一行加上 \(b_i-a_{i,i}\) 即可。

F.Zeros and Ones

首先发现一个位置的值即二进制表示中 \(1\) 的个数的奇偶性,那么问题就可以转化为求 \(0\sim m-1\) 中有多少个数满足 \(\text{popcount}(x)+\text{popcount}(x+n)\) 是奇数。发现这个问题的子结构相似,考虑数位 \(dp\):设 \(dp_{i,0/1,0/1,0/1}\) 表示当前到第 \(i\) 位,是否顶到上界,是否进位,\(1\) 的个数的奇偶性。直接转移即可。

CF Round #823 (Div. 2) on 9.25

A.Planets

如果同一类的个数 \(\ge c\) 则一起轰,否则一个一个轰。

B.Meeting on the Line

可以直接二分时间然后求出每个人能到达的区间,判断区间的并非空即可,然而打的时候被卡精度了\kel。

令一个人的 \(L_i=x_i-t_i,R_i=x_i+t_i\),取答案为 \(\frac{\min\limits_{i=1}^nL_i+\max\limits_{i=1}^nR_i}{2}\) 即可,可以用调整法证。

C.Minimum Notation

发现保留的数一定单调不降,于是维护一个单调栈,每次二分出最小的可以替换的位置插入并将后面清空,最后将在栈中的元素和不在栈中的元素 \(+1\)sort一遍即可。

D.Prefixes and Suffixes

翻转 \(T\),发现同位置的两个字符相对位置不变,因此开一个桶存下每对字符的个数,判断是否能成为一个回文串即可。

E.Maximums and Minimums

可以用单调栈求出前后的第一个大于或小于的位置,考虑枚举 \(i=1\sim n\) 作为最大值,枚举其约数,用一个指针求出 \(i\) 左右最近的约数位置,容易通过上述信息求出 \(l,r\) 可以取到的区间。

CF 1726 VP on 9.27

A.Mainak and Array

\(ans=\max\{\max\limits_{i=1}^n(a_i-a_{i+1},esp:a_{n+1}=a_1),a_n-\min\limits_{i=1}^{n-1}a_i,\max\limits_{i=2}^na_i-a_1\}\)

B.Mainak and Interesting Sequence

无解的情况为 \(n>m\)\(n\%2=0\wedge m\%2=1\),其余就把前面输出一堆 \(1\),后面 \(1\ or\ 2\) 个包揽就行。

C.Jatayu's Balanced Bracket Sequence

用栈求出每个括号的对应位置并合并,如果对应位置前面一个也能匹配上就合并。

D.Edge Split

发现树的情况无论边是什么颜色答案都为 \(n+1\),因此其他边都取红色,只考虑非树边,显然都取蓝色会很优,然而当一条非树边两端都被覆盖了两次时发现让深度大的点上面一条边取蓝色更优,判一下即可。

E.Almost Perfect

发现满足要求的排列一定为一些一元环,二元环,四元环的形式,若只有一元环和二元环可以考虑 \(dp_i=dp_{i-1}+(i-1)\times dp_{i-2}\),考虑四元环,设有 \(k\) 个,发现其实质是选出 \(2k\) 个长度为 \(2\) 的不交的块,想到骨牌覆盖的形式,就是去掉 \(2k\) 个位置再选 \(2k\) 个位置,方案数是 \(\binom{n-2k}{2k}\times \frac{2k!}{k!}\),因此答案是 \(\sum\limits_{4k\le n}\binom{n-2k}{2k}\times\frac{2k!}{k!}\times dp_{n-4k}\)

G.A Certain Magical Party

\(L=\min\limits_{i=1}^na_i,R=\max\limits_{i=1}^na_i\)

\(L=R\),直接输出 \(n!\) 即可。现在考虑 \(L<R\) 的情况。首先,令 \(T\) 为最后所有人相同的值,显然有 \(T\ge R\),容易证明以下几点:

  • 若有解,对于 \(a<T\),至多有一个人满足 \((a_i,b_i)=(a,1)\)

    • 证明:反证法,若至少有两个人,那么前面一个人的 \(a\) 必定增加,这时后面一个人就会多出一个人的贡献,必大于 \(T\)
  • 若有解,则 \(T=L+n-1\)

    • 证明:考虑 \(L\) 所对应的人,若为 \((L,0)\),则无论放在什么位置他的 \(a\) 都无法增加,因此必为 \((L,1)\),而根据上述性质,其他 \(n-1\) 个人的 \(a\) 都必大于他,因此无论怎样他的 \(a\) 都会且仅会加到 \(L+n-1\)
  • 若有解,则不同大小的 \(a\) 的相对位置是确定的,且为降序,且当 \(a\) 相同时,\(b=1\) 一定放在 \(b=0\) 之前(除 \(a=T\)\(b=1\) 的位置是任意的)

    • 证明:若一个更小的 \(a\) 放在前面,那么他会变成 \(T\),又因为 \(T\ge M\),而对于后面更大的,若 \(b=0\),则小于他的一定减少 \(1\),若 \(b=1\),则大于他的一定增加 \(1\),这样就使得其不满足条件。而 \(a\) 相同时,若 \(b=0\) 放在前面,那么他变成 \(T\) 后,\(b=1\) 一定增加 \(1\),不满足条件。

有了这三条性质,答案就是所有不同二元组 \((a,b)\) 的个数的阶乘之积了。

CF Global Round 22 on 9.30

A.Glory Addicts

首先计算冰火技能分别有多少个。如果个数不同,不妨设冰技能个数少于火技能个数,那么可以在第一个安排火技能伤害最小的那个,然后冰火交替从大到小放。否则就从第一个放冰和第一个放火中取大的一种。

B.Prefix Sum Addicts

一个简单的判断是给出的 \(k\) 个前缀和可以算出后 \(k-1\) 项,先判一次,然后考虑什么情况下前面放不了,容易发现即 \(a_{n-k+2}\times(n-k+1)<sum_{n-k+1}\),注意特判 \(k=1\) 时一定有解。

C.Even Number Addicts

简单博弈论,直接按博弈方式记搜即可。

D.Permutation Addicts

显然 \(\forall i\le k,b_i>i\ | \ \forall i>k,b_i<i\),因此 \(k=\max\limits_{b_i>i}i\)

考虑构造 \(a\)。首先按照操作可以建出一张 \(b_i\to i\) 的图,容易证明这张图是一棵树(\(n\) 条边中至少一条连向 \(0\)\(n+1\) 且联通),还可以发现每个结点最多一个后继不是叶子(否则出现并行关系),于是直接对每个结点的后继按后继个数从小到大排序后扔进队列里迭代即可。

H.Palindrome Addicts

首先肯定是要建一个回文自动机的,但这个删除操作十分棘手。

考虑维护一个标记 \(tag_u\) 表示结点 \(u\) 表示的回文串最后一次出现的 \(r\),显然所有有值的 \(tag\) 数就是答案。那么根据 \(PAM\) 的增量性质,只有在当前 \([l,r]\) 内的最长回文后缀才可能成为新的回文子串,在这个位置打个标记,当这个结点被删除时将标记推给父亲。删除时,枚举所有左端点为 \(l\) 的结点将它们删除,可以发现如果一个结点要删除,它的儿子一定都已经删除(因为要在左右添加字符后左端点一定已经访问过),那么所有的标记都已经上传,所以可以直接计算。复杂度 \(O(n)\)

CF Round #824 (Div. 2) on 10.2

A.Working Week

输出 \(\lfloor\frac{n-6}{3}\rfloor\)

B.Tea with Tangerines

取最小的那一个作为 \(\min\),对于其他的二分出要均分切几刀才能满足条件,注意特判多出的长度。

C.Phase Shift

贪心地取字典序小的匹配,若匹配后形成了长度小于 \(26\) 的环则不合法,用并查集维护。

D.Meta-set

首先发现 均相同或均不同 可以转化为和是 \(3\) 的倍数,于是先预处理出所有二元集,由于题目保证互不相同,可以快速求出一张卡片能与多少个二元集组成三元集,又由于题目保证互不相同,所以与一张卡片匹配的二元集两两无交,令 \(c_i\) 表示与一张卡片匹配的二元集个数,答案即 \(\sum\limits_{i=1}^n\frac{c_i\times(c_i-1)}{2}\)

CF Global Round 23 on 10.15

A.Maxmina

猜个结论:存在 \(1\) 就为YES

场上的做法是先把连续的一段 \(0\)\(1\) 缩起来,然后对前缀执行一次操作 \(2\),不断做。

B.Rebellion

从前往后扫,如果为 \(1\) 就加到最后一个 0 上。

C.Permutation Operations

差分后变成在差分数组上单点加,然后发现 \(diff_i\ge -a_i\),因此第 \(a_i\) 次操作加在 \(i+1\) 上即可。

场上 \(FST\) 了。

D.Paths on the Tree

首先发现若一棵子树分配到了 \(x\) 条路径,那么对于 \(y\) 个儿子,每个一定分配到 \(\lfloor\frac{x}{y}\rfloor\) 条路径,剩余的每个儿子最多分配 \(1\) 条。那么可以从儿子得到选它的贡献,选最大的 \(x-\lfloor\frac{x}{y}\rfloor\) 个即可。留给父亲的则是下一个儿子 \(+s_u\)

E.Joking

强逻辑性的题目。

考虑每次将询问范围分段,通过询问排除。分两段显然不行,因为交互库只要对两个都说 \(YES\) 就无法判断了,分三段则是可行的,略加推理即可得到每次能去掉 \(\frac{1}{3}\),这样就能通过 \(Easy\) 了。但我们发现上一层和这一层之间的连续两个没有用到,考虑设全集为 \(U\),交互库已经告诉答案在 \(S\) 中,\(T=C_US\),那么下一步我们需要在 \(S,T\) 中各选一些数继续询问,设 \(S_0,T_0\) 为选的集合,\(S_1=C_SS_0,T_1=C_TT_0\),若交互库给出 \(YES\),那么下一步的 \(S=S_0\cup T_0,T=S_1\)(因为两次都得知答案不在 \(T_1\) 里了直接排除),否则 \(S=S_1\cup T_1,T=S_0\)\(T_0\) 排除同理),自适应的交互库肯定会选大的那种让你继续,于是可以考虑 \(dp\) 出决策,当然不可能去 \(dp\) 所有决策,但发现在 \(|U|\) 较大时直接分别折半就能达到去除 \(\frac{1}{4}\) 的效果,那么就只需要 \(dp\) 一下 \(n\) 较小的决策了。

F.Kazaee

这种较难判定的东西可以考虑随机权值哈希,用所有数权值的哈希值之和是否为 \(k\) 的倍数判定,一次失败的概率不会大于 \(\frac{1}{2}\),大概几十次正确率就会很高了。证明不会。

CF Global Round 19 VP on 10.16

A.Sorting Parts

显然只有原序列不降为 \(NO\)

B.MEX and Array

预处理所有区间的 \(\text{mex}\),然后 \(O(n^3)\ dp\) 即可。

C.Andrew and Stones

只有 \(n=3\) 且有一个为奇数或所有数的和为 \(n-2\) 无解,否则直接输出 \(\sum\limits_{i=2}^{n-1}\lceil\frac{a_i}{2}\rceil\) 即可。

D.Yet Another Minimization Problem

拆式子后先把答案加上 \((n-2)\times a_i/b_i^2\),然后可以用一个 \(dp\) 计算剩余部分的答案,设 \(dp_{i,j}\) 表示前 \(i\) 个数一边的和为 \(j\) 的最小值,转移就是两个平方差。

E.Best Pair

发现对于 \(cnt\) 相同的取 \(x\) 最大的一个匹配即可,于是考虑枚举一个 \(x\),在 \(cnt\le cnt_x\) 中选最大的匹配,如果 \(ban\) 掉了就选下一个,复杂度为 \(O(\sum cnt)=O(n)\),瓶颈在排序。

F.Towers

容易发现如果一个塔不在叶子上,移到它所属的一个叶子上一定不会更劣,题目变为在每个叶子上建一座塔,保证非叶子结点作为根时子树中至少有两个 \(\ge h_i\)。可以换根 \(dp\),但发现如果取 \(h_i\) 最大的 \(i\) 作为根时,其他结点就可以少一个限制,于是在遍历时返回一个子树最大值,如果不够就调整到 \(h_i\),根再加上一个次大值即可。

Codeforces Round #829 (Div. 1 & Div.2)

A.Technical Support

从后往前扫,后缀和 \(<0\) 了就 \(NO\)

B.Kevin and Permutation

手玩发现答案上界是 \(\lfloor\frac{n}{2}\rfloor\),考虑间隔为 \(\lfloor\frac{n}{2}\rfloor\) 地反复横跳构造即可。

A.Make Nonzero Sum

无解显然只有和为奇数,略分析发现 \(0\) 的作用仅仅是改变奇偶性,因此考虑记录上一个非零位置,分类讨论区间长度来构造即可。

B.Factorial Divisibility

\(i+1\)\(i!\) 相当于一个 \((i+1)!\),于是从小到大推上去即可。

C.Wish I Knew How to Sort

只有交换处于排序后 \(0\) 的部分的 \(1\) 和处于排序后 \(1\) 的部分的 \(0\) 会减少逆序对数,当有 \(x\) 个逆序对时成功操作的概率为 \(P(x)=\frac{x^2}{\frac{n\times(n-1)}{2}}\),可以得到期望 \(E(x)=P(x)+(1-P(x))\times(1+E(x))\),列个方程解得 \(E(x)=\frac{\frac{n\times(n-1)}{2}}{x^2}\),求个和即可。

D.The Beach

考虑将椅子的移动改为空格的移动,发现空格只会直着走两个或斜着走一格,那么如果将棋盘黑白染色后空格所在的颜色是不会改变的,因此 \(Dijkstra\) 出使某个位置有空格的最小花费,枚举新椅子放在哪里即可。

E.N Machines

注意到初始答案不超过 \(2\times 10^9\) 的条件,这告诉我们 \(\ge 2\) 的乘法操作至多 \(31\) 个。因此我们可以考虑贪心的搜索哪些乘法操作放到最后面,然后计算把一些加法操作放到最前面的答案。这个复杂度巨大,但考虑到对于值相同的乘法操作,先选在前面的一定不会更劣,利用这个性质,状态数骤减至 \(2^{11}\) 左右,那么对于被剩下乘法操作分段的加法操作,可以现段内排个序,然后二分出剩余可操作次数最小的贡献,每个一段内二分出能达到最小贡献的元素个数,再维护个前缀和快速计算即可。

F.Minecraft Series

转化一下条件即 \(\text{mex}_{x\ge0}+\text{mex}_{x\le0}-1\ge t\) ,根据 \(\text{mex}\) 的经典性质,\(S\)\(\text{mex}\ge S\) 的子集的 \(\text{mex}\),考虑在对角线上枚举,用双指针维护固定左端点时最小的右端点,\(\text{mex}\) 的计算可以用 \(bitset\) 方便地实现。

Codeforces Round #831 (Div.1+Div.2) VP

A.Factorise N+M

质数的两倍一定是合数,于是输出 \(n\) 即可。

B.Jumbo Extra Cheese 2

贪心的让相邻的公共边尽量长,因此所有矩形选长边竖着放,从小到大排序。

C.Bricks and Bags

发现 \(y\) 贡献很大,那么要么是 \(y\) 放一个大数,另外两个选一个剩余最大的,另一个选最小的,要么是选一个大数,再选一个数,再选一个小于上一个数的放在 \(y\)。排序后从大到小扫一遍,前一个用 \(set\),后一个维护前缀 \(\max{a_i-2\times a_{i-1}}\)

D.Knowledge Cards

能用来放的格子有 \(n\times m-2\) 个,那么对于一张卡,要让在它前面还比它大的都先存在格子里,判断这个即可。

E.Hanging Hearts

删掉一个点添加的数为子树中最小的 \(p_i\),于是我们贪心的考虑让深度小的放大数,先删掉非儿子,然后对于所有儿子,从小到大删,那么删到这个点的最大 \(LIS\) 即为 \(\max(\sum\limits_{v\in son(u)}LIS_v,\max\{dep_v\}-dep_u+1)\),而且可以证明一定有一种分配达到这个最优状态。

F.Conditional MIx

首先若可重集内元素个数不满 \(n\) 个,可以通过补 \(0\) 补到 \(n\) 个。同时我们发现,对于可重集内两个集合 \(i,j\),若集合大小分别为 \(M_i\)\(M_j\)\(M_i>M_j\),则 \(i\) 中存在一个数可以取出放入 \(j\) 中。也就是说对于两个可重集 \(M,N\),如果对于 \(\forall 1\le k\le n\) 都有 \(\sum_{i=1}^k M_i\ge\sum_{i=1}^k N_i\),那么若 \(M\) 能被表示出来则 \(N\) 也可以被表示。

那么 \(\sum_{i=1}^k M_i\) 的上界是多少呢?对于出现次数小于 \(k\) 的数,肯定是可以都选的;对于出现次数大等于 \(k\) 的数,至多只能选 \(k\) 个。所以假设 \(cnt_i\) 表示 \(i\) 出现的次数,那么 \(\sum_{i=1}^k M_i\le\sum_{i=1}^k \min(k,cnt_i)\),同时不难构造出一个可重集 \(M\) 使得等号都成立,因此问题转化为求满足该条件的集合有多少个。

从大到小选数。设 \(f_{i,j,k}\) 表示前 \(i\) 个,和为 \(j\),已选的最小的数为 \(k\),转移可以用前缀和优化至 \(O(1)\)。同时注意到第一维可以滚动掉,且 \(k\le\lfloor\frac{n}{i}\rfloor\),那么总时间复杂度就是 \(O(n^2\ln n)\) 的,空间复杂度 \(O(n^2)\)

G.Dangerous Laser Power

手玩样例让我们大胆猜想,答案的上界为 \(n\times m\) 且一定能达到。考虑构造这个上界:从小到大加入 \(portal\),同时维护每个 \(portal\) 四个方向入的光线数及能量值,那么答案就取模 \(2\) 的余数,由于从小到大加入,会发现之后这个 \(portal\) 的能量值不会再变化。能量的变化可以用并查集方便的维护。

H.MEX Tree Manipulation

首先容易发现的是加入一个点至多影响到根的一条链上的 \(\text{mex}\),因此假如已经知道除了有影响的这个儿子之外的 \(\text{mex}\),加入这个儿子之后是一个自动机的形式:

\[\text{output}=\begin{cases} \text{mex}&[x\not=\text{mex}]\\ \text{secmex}&[x=\text{mex}] \end{cases} \]

这个自动机是可并的,考虑用树剖 \(+\) 线段树维护。对于一条重链,可以维护经过这一段之后的输出,以及经过这一段后 \(\text{mex}\) 的和,在重链之间暴力修改,取根结点信号为否的和为答案。复杂度是 \(O(n\log^2n)\)

CodeTON Round 3 (Div.1+Div.2)

A.Indirect Sort

第一种情况没屁用,第二种情况即要交换两个数,后面那个数前面必须要有比它小的,那么首项就必须是 \(1\) 了。

B.Maximum Substring

要么选一段最大的 \(0/1\),要么就全选。

C.Complementary XOR

手玩发现有解当且仅当 \(a\ \text{xor}\ b\) 全为 \(0/1\),先考虑把 \(a\) 中所有的 \(1\) 连续段消掉,那么消完后 \(b\) 要么全 \(0\) 要么全 \(1\),全 \(0\) 就结束了,否则可以先把 \(a\) 变成全 \(1\),然后随便选个 \(x\) 执行 \([1,x],[x+1,n]\) 即可。

D.Count GCD

扫一遍,每一项的贡献即 \(\sum\limits_{i=1}^m[\gcd(a_{x-1},i)=a_x]\),首先若 \(a_x\not\mid a_{x-1}\) 答案直接就为 \(0\),必须退出(不然影响后面均摊的复杂度),否则这个等价于求 \([1,\lfloor\frac{m}{a_x}\rfloor]\) 中与 \(\frac{a_{x-1}}{a_x}\) 互质的数的个数,这是一个经典的容斥,需要计算所有质因子求解。所以复杂度是 \(O(n\sqrt m)\)?非也,我们发现若 \(a_x=a_{x-1}\) 答案就是 \(\lfloor\frac{m}{a_x}\rfloor\),否则 \(a_x\) 每次至少除 \(2\),根据基本不等式的相关结论会有 \(\sum\sqrt{a_i}\le\sqrt{\sum a_i}\),而 \(\sum a_i\) 显然是 \(O(m)\) 级别的,容斥部分复杂度 \(O(\sigma_0(a_i)2^{\sigma_0(a_i)})\) 是很小的,因此实际复杂度是 \(O(n+\sqrt m)\) 的(当然如果剪枝少了一个复杂度就退化了)。

E.Bracket Cost

不容易发现一个结论:区间 \([l,r]\) 的花费是 \(\max(sum_{l-1},sum_r)-\min\limits_{i=l-1}^rsum_i\),其中 \(sum\) 是括号序列的前缀和。

必要性:每次操作上式至多减 \(1\)

充分性:构造证明:若 \(sum_{l-1}<sum_r\),则在结尾添加一个 \()\),若 \(sum_{l-1}>sum_r\),则在开头添加一个 \((\),若 \(sum_{l-1}=sum_r\),则选取最后一个 \(sum_x=\min\limits_{i=l-1}^rsum_i\),进行一次操作一。容易发现每次操作上式都能减 \(1\)

把这个式子拆开计算,前一部分可以用树状数组,后一部分可以用单调栈。

Codeforces Global Round 21 VP

A.NIT orz!

执行一次操作后 \(z\) 一定会变小,那么不如直接让它去 \(or\) 每个数。

B.NIT Destroys the Universe

显然答案上界为 \(2\),判断一下非 \(0\) 连续段数即可。

C.Fishingprince Plays With Array

把一个能拆的数拆到不能拆为止一定不会更劣,然后从前往后匹配即可。

D.Permutation Graph

显然要走一定会走得最远,那么走过的数一定是一段折线,用单调栈预处理每个数后面第一个大于 \(/\) 小于它的数,用 \(ST\) 表快速询问,在两种情况中取较小的。

似乎有更简单的做法。

E.Placing Jinas

根据数学直觉,发现这个类似于一个杨辉三角,根据格路的组合意义会得到一行的贡献就是 \(\binom{i+a_i}{a_i-1}\)

F.Tree Recovery

发现对于一条树边 \((x,y)\),若有 \(a_{x,z,y}=1\) 说明 \((y,z)\) 也为一条树边,进而可推得全树。那么枚举 \((1,p)\) 存在于树中,可以 \(O(n^3)\) 的判断是否合法,复杂度即为 \(O(n^4)\)

Pinely Round 1 (Div.1+Div.2)

A.Two Permutations

显然需要前后缀不重叠且中间至少有两个位置,或者前后缀直接都 \(=n\)

B.Elimination of a Ring

手玩一下发现除非 \(\forall a_i=a_{i\mod 2}\) 可以达到 \(\frac{n}{2}+1\),其余情况均为 \(n\)

C.Set Construction

首先这个图有解必须是个 \(DAG\),考虑如何保证所有集合互不相同,容易发现只要让初始 \(S_i=\{i\}\) 即可。

D.Carry Bit

考虑枚举将 \(k\) 次进位分成 \(x\) 段,一段的进位即钦定第一个位置为 \((1,1)\),后面一段可以选 \((0,1),(1,0),(1,1)\),最后用一个 \((0,0)\) 来截断,而没有被覆盖的位置则可以选 \((0,0),(0,1),(1,0)\)。那么任意选的位置有 \(n-2\times x\) 个,在所有位置中选出 \(x\) 个位置放连续段的方案数为 \(\binom{n-x-k+x}{x}\),连续段的划分方案数为 \((k-1,x-1)\),注意还有一种最后一个以 \(n+1\) 做截断的情况。

E.Make It Connected

大分类讨论题。

  1. 已经连通,答案为 \(0\)

  2. 存在一个孤立点,答案为 \(1\)

  3. 存在一个连通块不为团,答案为 \(1\),需要找到一个不是割点且度数不为 \(siz-1\) 的点。

  4. 有多于两个连通块,取两个不同连通块的点即可。

  5. \(otherwise\):取小的那个连通块,其中所有点都需要操作。

posted @ 2022-10-04 13:09  pidan007  阅读(381)  评论(1编辑  收藏  举报