Atcoder 乱做

这里面有一部分题没有写过代码,不保证完全正确。

AGC006E Rotate 3x3

久仰大名。

首先把一些 sb 情况判掉。认为 \(3i+1,3i+2,3i+3\) 为正,否则为负。

然后你乱手玩一波,发现当 \(n \geq 5\) 时,可以翻转任意隔着一列的两列的奇偶性。(小写为正,大写为负)。

\[a \ b \ c \ d \ e \\ C \ B \ A \ d \ e \\ C \ B \ E \ D \ a \\ e \ b \ c \ D \ a \\ e \ b \ A \ d \ C \\ a \ B \ E \ d \ C \\ a \ B \ c \ D \ e \]

于是你发现,只需要把奇偶性个数相同的列转到正确位置,然后判负数总和模 2 即可。

在转的过程中,奇偶性不同的列会产生贡献,大小是内部的逆序对数。

AGC007E Shik and Travel

首先你考虑二分答案。

进入一个子树之后就要走完这棵子树。于是你对于每个点存一些 \((l,r)\),表示走下去是 \(l\),走上来是 \(r\) 的方案在子树内是合法的。

注意到如果 \(l < l',r<r'\),那么 \((l',r')\) 就废了。所以每个点保存的 pair 会是 \(l\) 单调增,\(r\) 单调减的。

于是合并两个点的时候,就只考虑小的作为起点和终点的方案数就行了。用一个指针维护。

AGC007F Shik and Copying String

首先你要把转移写成折线的形式。然后从右往左贪心,每条折线要尽量和它右边的折线贴贴。

然后我编了一个垃圾线段树做法,考虑用线段树维护每个高度的最右边的点,然后插入的折线的时候在线段树上二分找到满足要求的地点就可以了。你发现它等价于相邻下标 chkmax,区间赋值,区间加。你用一个魔改下标的线段树应该可以比较容易维护这个东西。

下面是正解。还是考虑维护每个折点的位置。注意到每次加入线段实际上是删除末尾的一些折点,然后把剩下的折点向左下平移一格。所以用队列维护,那么你发现对于队首的折点,它刚好被移动了 size-1 次,所以直接用 size 判是否要删除。

贴个代码吧。

queue<int> q; int pos=n;
drep(i,n,1)
{
	if (t[i]==t[i-1]) continue; pos=min(pos,i);
	while (pos&&s[pos]!=t[i]) pos--;
	if (!pos) return printf("-1\n"),0;
	while (!q.empty()&&q.front()-q.size()>=i) q.pop();
	if (i!=pos) q.push(pos);
	ans=max(ans,(int)q.size()+1);
}

AGC008D Kth-K

有一个比较暴躁的贪心思想,每次挑离当前节点最近的颜色放,直到放完为止。

做两遍这个贪心就行了。

AGC008E Next or Nextnext

先建出一个 \(i \rightarrow p_i\) 的图,这个图一定是由若干个环组成的。

那么对于每个环,它可能变成四种情况:(其实就是官方 ed 里的四个 Type)、

  • 1,啥也不变。
  • 2,奇环每次跳两个。
  • 3,偶环每次跳两个,会搞出两个 size/=2 的环。
  • 4,变成了一个奇怪的基环内向树。

那么对于前三种情况,处理是比较容易的。对于第四种情况,首先要满足每个点的入度最多是 2。然后你需要把外面的链塞回去,这玩意可以根据链长和距离上一条链的距离搞出来。如果 \(d_1 < d_2\),就有两种情况。如果 \(d_1 = d_2\),就只有一种情况。如果 \(d_1>d_2\),没有情况。

AGC008F Black Radius

考虑计数的时候如何不重不漏。把每个连通块的直径拉出来,记 \(x\) 为直径中点(可能是边),那么每个连通块可以被唯一地表示成 \(f(x,d)\) 的形式,同时对于每个 \(x\),合法的 \(d\) 是一个区间。证明比较感性吧。

如果 \(x\) 是边,设 \(x = (u,v),mxdep_u\leq mxdep_v\),那么一定是先填满 \(u\) 子树,再填 \(v\) 子树。所以如果 \(u\) 子树内有好点,贡献就是 1。

如果 \(x\) 是点:

  • \(x\) 是好点。下界是 0,上界是 \(2th-min\{mxdep_v|v \in son_u\}\)
  • \(x\) 不是好点。下界是 \(min\{mxdep_v|v \in son_u\}\),上界没有变化。

AGC009D Uninity

麻了又瞄到 pb 题解,xtbl。

考虑一个转化,相当于把每个点标数,然后要满足任意两个相等的数之间有比它们大的数。

直接贪心,记 \(f_{u,k}\) 表示 \(u\) 的子树内,\(k\) 向上有无贡献过。记 \(g_{u,k} = \sum\limits_{v \in son_u} f_{u,k}\),那么 \(u\) 的颜色 \(c\) 需要满足 \(g_{u,c}=0 \and \forall i<c,g_{u,k} < 2\)。取最小的 \(c\) 就了,因为取更大的显然不优。即使直接按照点分治的染法搞,也最多只有 \(O(\log n)\) 种颜色。所以直接开数组就行了。

AGC009E Eternal Average

差一点点推出来 /ll。

如果没有黑球或者没有白球,答案就是 1。先把这玩意特判了。

\(a = {(n+m-1) \over (k-1)}\),那么答案一定可以写成 \({x \over k^a}\) 的形式。发现这玩意非常不友好,就把它写成 \(k\) 进制,设最后一位不为 0 的是第 \(t\) 位:

\[0.s_1s_2s_3 \cdots s_t \]

发现上面这玩意需要满足两个条件:

  • \(\sum s \equiv m\ (mod \ (k-1))\)。这是因为有进位。
  • \(n+\sum s \geq 1+t\times(k-1)\)。这是因为可以把它看做一棵 \(k\) 叉树,0/1 都在叶子上。非叶子的权值是儿子权值的平均值。要能够补成一个完整的 \(k\) 叉树。

大力 dp 就行了。

AGC010E Rearranging

又只差一点 /ll /ll。

注意到两个不互质的数的相对位置一定不会改变。在第一次操作序列确定之后,把前面的数向后面不互质的数连边,答案就是这个 DAG 的字典序最大拓扑序。

问题在于如何搞出这个 DAG。注意到可能的连通块内的链有传递性,我们只需要满足每个连通块内字典序最小即可。具体的方法是从最小的数开始 dfs,每次找到与它相连的最小的没有被选过的数,然后继续 dfs。容易发现这样相邻两个数一定不会被 swap。

AGC010F Tree Game

心路历程:你个辣鸡红题能秒我? $\rightarrow $ 博弈论哥哥,我错了呜呜呜。

把每个点作为根,然后判是否合法。

硬点不能走出子树,先从简单的情况开始讨论:

  • 只有一个点的情况:先手必败。
  • 只有两个点的情况:设当前是 \(u\)。当且仅当 \(a_u > a_v\),先手必胜。
  • \(mxdep=2\) 的情况:父亲只能走到儿子,儿子也只能走到父亲。父亲就一定会走到 \(a_v\) 最小的儿子。所以先手必胜等价于 \(a_u > min\{a_v\}\)
  • 其他情况:首先 Taka 显然不会突发恶疾,走到先手必胜的儿子上面。他只会走到后手必胜的儿子上面。这个时候 Aoki 会挣扎一下,走回父亲。所以这玩意差不多等价于上一种情况。如果没有后手必胜的儿子?寄!

AGC011F Train Service Planning

早就看过这题了,但是一直没补。因为每隔 \(k\) 时刻就有一辆车发车,所以以下操作全都在模 \(k\) 意义下进行。

考虑一辆从 \(0 \rightarrow n\) 的车,设 \(p_i\) 是这辆车在站 \(i\) 停靠的时间。再考虑一辆 “幽灵车” 也是从 \(0\) 发车,但是经过的时间是负数,设 \(-q_i\) 是这辆车在站 \(i\) 停靠的时间。设 \(Sp,Sq\) 分别是 \(p\)\(q\) 的前缀和。

发现这两辆车经过路段 \(i\) 的时间不能相交,也就是 \((Sp_{i-1}+Sa_{i-1},Sp_{i-1}+Sa_i)\)\((-Sq_{i-1}-Sa_{i-1},-Sq_{i-1}-Sa_i)\) 不交。

经过一堆分类讨论和化简,搞出上面这个条件等价于 \(Sp_{i-1}+Sq_{i-1}\notin(-2Sa_i,-2Sa_{i-1})\)

\(x_i=Sp_{i-1}+Sq_{i-1}\) ,问题转化为维护一个递增的变量 \(x\),使 \(x_i \in [l_i,r_i]\)。发现移到左端点是最优的,线段树维护即可。

AGC012E Camel and Oases

看完题解大呼自己傻逼。

显然发现它只有 log 层,然后满脑子 combine 两个区间,二进制合并之类的。学傻了属于是。

可以看作拿 \(cnt\) 条线段把整个区间铺满。注意到最长的线段是确定的。设 \(f_S,g_S\) 分别表示从左边用长度集合 \(S\) 能选到的最右点,从右边用长度集合为 \(S\) 能选到的最左点,随便转移。

最后 check 一下就行了。

AGC012F Prefix Median

大力口胡一波,发现 \(b\) 序列需要满足几个条件:

\[b_i \in [a_{i},a_{2n-i}]\\ \forall i \ \not\exist j<i,min(b_{i},b_{i+1}) < b_j < max(b_i,b_{i+1}) \]

倒着 dp,发现操作过程就是先把 \(a_l,a_r\) 加进集合,unique,然后选择集合内一个合法的数扔到 \(b\) 里面,并且把 \((b_{i},b_{i+1})\) 变成不合法。发现合法的数一定是一段连续的前缀和后缀。设 \(dp_{i,l,r}\) 表示考虑完后 \(i\) 个数,左边合法前缀长度是 \(l\),右边合法前缀长度是 \(r\) 的方案数。随便转移。

AGC013D Piling Up

可以把第一次拿球和最后一次拿球单独算,后面就变成了放两个球再拿两个球。

一开始我用拿的红球个数 dp,后面发现折线会疯狂灵车漂移,超出限制,会有非法答案被统计。寄!

考虑正解,设 \(dp_{i,j,0/1}\) 表示前 \(i\) 轮,有 \(j\) 个红球,有无触底的方案数。随便转移。

AGC013E Placing Squares

瞪眼

\[dp_i = \begin{cases}0 & a_x=i \\ \sum\limits_{j=0}^{i-1}(i-j)^2dp_j & otherwise\end{cases} \]

有牛逼人设

\[a_i=\sum_{j=0}^{i-1} dp_j \\ b_i = \sum_{j=0}^{i-1}(i-j)dp_j \\ c_i = \sum_{j=0}^{i-1}(i-j)^2dp_j \]

再瞪一眼,转移可以写成矩阵的形式。做完了。

AGC013F Two Faced Cards

首先把所有数离散化。考虑数列 \(A\) 能否跟数列 \(B\) 匹配,相当于 \(A\) 每个位置对后缀加一,\(B\) 每个位置对后缀减一,最后要求每个位置都 \(\geq 0\)。交换 \(a,b\) 的意义,就是把 \([b_i,a_i)\) 加一。先假设都选 \(a\),那么在这样构造的序列里,从后往前,如果存在 \(\leq -2\) 的数,就不断选择覆盖这个点的区间里左端点最靠左的交换顺序。

对于 \(d,e\) ,可以分别统计答案。从前往后用类似的方法贪心即可。

AGC014B Unplanned Queries

猜了个必要的结论,仔细思考了一下貌似可以构造。莽了一发。

过了???????

AGC014D Black and White Tree

如果有完美匹配,就是后手必胜。否则令叶子为黑点,先手每次挑一个叶子的父亲,就强迫后手选白点。这样操作到有冲突的点的时候先手必胜。

AGC014E Blue and Red Tree

考虑一次操作,发现可以简化为选择两点间的一条边删去。需要保证在这次操作前,两点间路径完整。

于是发现每条边都会被删掉,只要删去被覆盖次数为 1 的边,然后更新覆盖次数即可。

树剖 + 线段树可以做到 \(O(n \log ^2 n)\)

AGC015D A or...or B Problem

被 czy 打爆了 /kx。

大力把前缀搞掉,然后发现有两个奇奇妙妙的区间,并且上下界非常显然。做完了。我为啥没想到呢 /fn。

AGC015E Mr.Aoki Incubator

考虑在 \(1e4514\) 秒之后,第 \(i\) 个人在 \(p_i\) 位。我们有理由怀疑,第 \(i\) 个人传染的人在 \(p\) 上是一个区间。对于两个人 \(i<j\),发生传染的充要条件是 \(p_i > p_j\)。那么第 \(i\) 个人传染的区间的左端点是 \(\max p_j,j \leq i\),右端点是 \(\min p_j, j \geq i\)

\(dp\) 的转移应该是基础线段树练习题。

AGC016B Colorful Hats

首先最大值与最小值差不超过 1。

然后如果最大值和最小值相等,要么每个人颜色不一样,要么每种颜色都有至少两个人。

如果不相等,那总颜色数就是最大值,看到最小值的人的颜色只有一个人有。

AGC016C +/- Rectangle

其实给第一个样例就挺白给的。每隔 h 行 w 列放一个关键点。然后适当把权值调大就能草过去了。

AGC016D XOR Replace

打爆了 czy !!!111

把数列异或和扔到数列后面,发现可以转化为每次可以交换任意一个位置和最后一个位置,问多少次能变成 \(b\) 序列。

发现入度等于出度,是一个欧拉回路。那就是 \(n\) + 环数,还有一些奇奇怪怪的边界条件搞定就行了。

AGC017C Snuke and Spells

把相同值的点看作覆盖在数轴上的的线段,右端点是这个值,长度是点的个数。发现需要的操作次数就是 \([0,n]\) 中没被覆盖的长度。暴力维护即可。

AGC017E Jigsaw

考虑把左右左右两边分别重新编号,使得编号相同的可以拼一起。问题转化为把一个图拆分成若干条路径,问有没有解。大力就行了。

AGC018B Sports Festival

拿到题以为它是一个神妙 dp。事实上并不是。

考虑贪心,每次把出现次数最多的那门课给扬了。

至于证明,答案集合要么是枚举到的集合的子集,显然不会更优。要么不是子集,把出现次数最多的课扬了会更优。

AGC018C Coins

首先假设全选 \(A\),那就相当于有 \(n\) 个二元组 \((e_i,f_i)\),要求选 \(y\)\(e\)\(z\)\(f\)。按照 \(e_i - f_i\) 排序,发现选 \(f\) 的一定在选 \(e\) 的前面。随便维护。

AGC018D Tree and Hamilton Path

题目的条件相当于一条汉密尔顿回路减掉一条边。

先考虑怎么求最大的汉密尔顿回路,容易发现答案是

\[\sum_{v \neq rt} 2w\times min(n-size_v,size_v) \]

考虑如何构造,发现如果存在大的子树内互相连边,并且小的子树没有往外连满的情况,一定可以用下图这种调整变为更优解。

考虑如何减去一条路径,发现只有减去经过重心的路径合法。随便搞搞就行了。

AGC018E Sightseeing Plan

首先考虑一个点到一个矩形的方案数,可以容斥出只跟四个角有关。

再考虑中间那个矩形,设入点 \((x_1,y_1)\),出点 \((x_2,y_2)\),贡献是 \(path(x_1,y_1,x_2,y_2) \times (x_2 - x_1 + y_2 - y_1 + 1)\)。你惊奇地发现两边贡献是独立的。带上系数进去直接算就行了。

AGC018F Two Trees

首先可以判断出每个点的奇偶性。如果两个图里奇偶性不同显然无解。否则在奇偶性是奇数的点之间连一条边,顺便把两棵树拼一起。

这样每个点的 deg 都是偶数,可以跑欧拉回路!在每个新加的边上定向就可以了!充分性是考虑某个子树,它有 \(k\) 条进边,\(k\) 条出边,其中一条一定是 \((u,fa_u)\)

AGC019D Shift and Flip

首先枚举最终位置是向右移动多少格。有变化的位置只有左右各一个 \(b_i = 1\) 有效。按 \(r\) 排序,枚举向右的最大距离,不用脑子就可以想到 \(O(n^2 \log n)\) 的做法。

向左同理。

AGC019E Shuffle and Swap

\(a_i\)\(b_i\) 之间连边。

发现两个字符串中都是 1 的点度数为 2。只有一个是 1 的点度数为 1,分别记为起点集合和终点集合,这两个集合大小相等。

那么这个图由一堆链和一堆环组成。

环随便排。

一条链由一个起点,中间若干个(可能是 0)中间点,和一个终点组成。链要严格按照顺序。

于是你设 \(f_{i,j}\) 表示用了 \(i\) 个中间点和 \(j\) 个起点组成的方案数。

\[f_{i,j} = f_{i,j-1}\times j^2 + f_{i-1,j} \times i \times j \]

即硬点新加的是最后一个,再计算标号。

可以证明和原序列是一一对应的。

最后注意不一定所有中间点都在链上。

AGC020C Median Sum

我去你的,\({2000^3 \over w}\) 的复杂度还真是正解。Atcoder 牛逼。就你🐎离谱。

AGC020D Min Max Repetition

二分端点位置,前面是 \(AAAAB\) 的循环节,后面是 \(ABBBB\) 的循环节。后面的起始位置需要乱搞。

AGC020E Encoding Subsets

考虑跟 CSP 2021 T2 一样的套路,设 \(f_{l,r}\) 表示区间 \(l,r\) 合法的编码数量,\(g_{l,r}\) 表示强制括起来的数量。

发现 \(f\) 的转移基本相同,\(g\) 的转移因为有子集限制,就相当于把所有循环节 \(and\) 起来。记忆化可以做到能过的复杂度。

AGC022E Median Replace

懂了,at 遇到无从下手的题套个栈硬艹就完了(雾)。

考虑维护一个栈。加 \(0\) 的时候看栈顶有几个 \(0\),如果凑够三个就扬了。加 \(1\) 的时候如果栈顶有 \(0\) 就一换一,否则直接加。如果栈顶有大于等于 \(2\)\(1\) 就不管了。最后看栈里 \(0\) 的个数是否小于等于 \(1\) 的个数。

发现 \(0\)\(1\) 最多只有 2 个,暴力转移。

AGC023D Go Home

考虑 1 和 \(n\) 两个点。发现如果 \(a_1 \geq a_n\) ,那么一定是先到 \(1\),再到 \(n\)。所以点 \(n\) 的人会帮点 \(1\),绑一起就行了。递归即可。

AGC023E Inversions

考虑经典式子 \(ans = \prod {(v_i - i+1)}\)

首先考虑 \(a_i = a_j\) 的情况,那么显然有 \(1 \over 2\) 的概率出现逆序对。

\(a_i < a_j,rk_i = x,rk_j = y\)

对于 \(i < j\) ,发现等价于 \(a_j \leftarrow a_i\) 的情况,那么就是 \(x,y\) 中间的一堆 \(v_k \leftarrow v_k - 1\)

对于 \(i>j\),发现可以变成总数减掉 \(p_i > p_j\) 的情况,算法和上面类似。

于是直接从大到小枚举 \(x\) 就可以了。

教训是不要乱化简式子 /ll。

AGC024D Isomorphism Freak

猜对了(?)

手玩一下,发现最小的颜色个数大概是 \(\lceil {直径 \over 2} \rceil\)。于是找到直径中点,直接构造即可。

AGC025D Choosing Points

发现对每个距离是二分图。分别染色即可。

AGC025E Walking on a Tree

对于树上的一条边,理论上界是 \(min(2,cover)\)。考虑把路径 \((u,v)\) 连边。那么对于欧拉图一定可以达到上界。对于非欧拉图,就想办法连边让它变成欧拉图。感觉在子树内瞎几把匹配很对!不管了。

AGC025F Addition and Andition

考虑一次操作会发生什么。如果一位上有两个 1,那么它们会往前走一位。否则不变。

总的 1 个数不会增加,所以暴力进位没啥大事。

那么从高位往低位考虑,维护当前搞出来的数。如果搞出一对 1,就一直往左飞,直到撞到另外的 1 或者寄掉。复杂度看起来是线性的。

AGC026F Manju Game

首先,对于一段区间,先手一定不劣于后手。其次,对于任意一段区间,先手总能取到 \(max(\sum odd,\sum even)\),具体方法容易手摸。

如果 \(n\) 是偶数。若先手选了中间的点,后手就会往长度为偶数的子区间走,这样可以获得下一个子区间的先行权,并且当前区间不劣。所以先手不如直接选两端的点吃低保。

如果 \(n\) 是奇数。若先手选了某个奇点,可以根据上面结论推出不优。所以先手要么选偶点,要么吃低保。先假设先手选了全部的偶数点,二分能多获得 \(x\) 的收益。注意到先手选择某个点相当于插了个墙进去,收益 \(\geq x\) 的必要条件是存在一种插墙方法,使得每个被墙分开的连通块收益都 \(\geq x\)。暴力判断即可。

AGC027B Garbage Collector

哈哈,我上来就猜每次一定拿连续的一段。我觉得这个结论很对啊!正确性完全不用证啊!然后我就莽了个李超线段树,一遍过所有样例,很对啊!交了一发直接 WA 飞,然后想了一下发现我就是个寄吧。

这个故事告诉我们,没证明/拍的结论别用 /kx。

考虑钦点拿的次数 \(k\) ,那么 X 的贡献就不用管了。把 \(x_i\) 的贡献拆开到每个单点,算贡献很方便,发现可以直接贪。做完了。

AGC027D Modulo Matrix

把矩阵黑白染色,黑色拆成两个质数的乘积,白色是相邻黑色的 lcm+1。

AGC028C Min Cost Cycle

把题目条件弱化成一条边两个值任选一个。就可以把所有点集像其他题解一样划分成四种情况。

然后你发现这玩意满足条件的话,答案不会更劣。

就做完了。

AGC029E Wandering TKHS

一个想法是先取出树上最大的点,设为 \(u\)。那么 \(u\) 的子树内点 \(v\)(不包括 \(u\))的答案就是 \(f_{fa_u} + \sum_{v \in subtree \ of \ u} v\)。并且这之后可以把 \(u\) 的子树全扔了。

考虑 \(f_u\) 怎么算。设 \(g_v\) 表示 \(v\) 这个点扩展过程中遇到的最大的点。令 \(w = g_{fa_u}\)。那在 \(u\) 扩张过程中到达的 \(u\) 子树内的点 \(v\) ,满足 \((u,v)\) 路径上所有点都小于 \(w\)。这个可以暴力 dfs 解决。反正每次都把剩下的子树删了。再顺手维护一个 \(g_v\)

那就做完了。

AGC030D Inversion Sum

\(f_{i,j}\) 表示 \(a_i > a_j\) 的概率。大力转移。

AGD031D A Sequence of Permutations

冷静一下,发现 \(f(p,q) = p^{-1} q\),其中乘法就是置换的乘法。再手玩几项,发现有循环节,那就做完了。

AGC031E Snuke the Phantom Thief

对于每条限制,相当于 \(x_{t+1} > X\)

考虑对第 \(t\) 个点的 \(x\) 坐标,它可以向若干个点连边。

\(x\) 看作左侧,\(y\) 看作右侧,合法的点看做一大条边,就可以了。

AGC032D Rotation Sort

操作的实际意义是把一个点往左/往右任意扔。那么没有被扔的点一定是一个上升的子序列。

\(dp_{i}\) 表示最后一个不被扔的点是 \(i\) 的最小代价,枚举上一个不被扔的点 \(j\),那么 \((i,j)\) 中间的点都要被扔到相应的地方去。

AGC033D Complexity

注意到答案至多是 \(\log\) 级别。

\(f_{l,r,x,k}\) 表示第 \([l,r]\) 行从 \(x\) 开始的这个矩形,复杂度不超过 \(k\) ,最右能到哪里。

竖着切是容易的,横着切只需要二分两条单调线的交点即可。

AGC033E Go around a Circle

假设以 \(R\) 开头。如果没有 \(B\),那就说明没有相邻的 \(B\)。随便 dp。

如果有 \(B\),那还是不可能有相邻的 \(B\)。并且每个极长 \(R\) 连续段都要是奇数。注意到每个点的移动路径是固定的,所以 \(R\) 连续段的长度不能超过 \(l\),其中 \(l = min\{len_1 \ ,len_i(i > 1 \and len_i \mod 2 == 1)\}\) 。转移的时候乘上第一段初始位置的系数就可以了。

AGC036F Square Constraints

题目可以抽象理解为,在一个四分之一圆环内选点,每行每列都要有一个点。每一列可以选的范围是 \((L_i,R_i]\)

考虑没有内圈环的限制怎么办,那就是把 \(R_i\) 排序,然后 \(\prod (R'_i + 1 -i )\)。组合意义解释是每个前面的选择会对后面的选择造成 1 的影响。

如果加上内圈限制,上面这个办法显然会不合法。考虑容斥,硬点有 \(k\) 个选择 \(\leq \ L_i\) 。这个时候要把原序列排序,使得后面元素的选择并不影响前面的选择。具体的方法是对于 \(i \in [0,n)\),按照 \(L_i\) 为第一关键字,\(R_i\) (倒序)为第二关键字。对于 \(i \in [n,2n)\),按照 \(R_i\) 为第一关键字。

\(dp_{i,j}\) 表示考虑了排序后的前 \(i\) 个数,有 \(j\) 个非法选择的方案数。记 \(now\) 为当前考虑到的数。

  • \(now \geq n\),原来有 \(R_{now}+1\) 个数可选,有 \(j\) 个非法选择,前面有 \(rcnt\) 个数 \(\geq n\),所以 \(dp_{i,j} \leftarrow dp_{i-1,j}\times(R_{now}-j-rcnt+1)\)
  • \(now < n\)
    • 如果这个数合法,原来有 \(R_{now}+1\) 个数可选,要为 \([n,2n)\) 留出 \(n\) 个位置,并且钦点了 \(k\) 个非法位置,还有 \(now<n\) 的合法数量。所以 \(dp_{i,j} \leftarrow dp_{i-1,j}\times(R_{now}+1-n-k-lcnt+j)\)
    • 如果这个数非法,原来有 \(L_{now}+1\) 个数可选,已经选了 \(j\) 个非法的,并且有 \(rcnt\) 个数占位置,所以 \(dp_{i,j+1} \leftarrow dp_{i-1,j} \times (L_{now}+1-j-rcnt)\)

AGC047E Product Simulation

首先要实现一个数的二进制拆分。再实现 \(\log^2\) 的乘法。

AGC048D Pocky Game

结论1:先手取的第一堆里的石子数越多越好。

  • 证明:设多了 \(k\) 个,那么只需要在第一步多取 \(k\) 个就能对应原来的操作序列,这样严格不劣。

结论2:要么取一个,要么取一堆。

  • 是结论 1 的推论。

\(f_{l,r}\) 表示只保留 \([l,r]\) 内的石子,左侧先手,最小的 \(a_l\) 的值使左侧获胜。\(g\) 是右侧。

\[f_{l,r} = \begin{cases} 1 & l=r\\ 1 & a_r<g_{l+1,r} \\ a_r - g_{l+1,r} + 1 + f_{l,r-1} & a_r \geq g_{l+1,r} \end{cases} \]

\(g\) 类似。

ARC058E Iroha and Haiku

大力容斥,减掉不合法的方案就行了。

直接上状压。

ARC059F Unhappy Hacking

先讲一下我的做法吧,首尾有两次乱放机会,首的可以 dp 搞出来,尾的是一个类似于卡特兰数的东西。然后你把这两个玩意卷积一下。设 \(f_{i,j}\) 表示第 \(i\) 位在第 \(j\) 个时刻选好之后,不会再被退格的方案数。转移的时候大力枚举在 \(i\) 的乱搞时间,然后也乘一个类似卡特兰数的系数。这玩意应该可以前缀和优化到 \(O(n^2)\)可以过了。

没有看懂洛谷题解。

ARC061E Snuke's Subway Trip

脑子一抽搞出了正解,爽啦!(看了眼洛谷题解区,好像没有和我一样的做法)。

首先把每种公司可以免费换乘的连通块搞出来。这时候注意到每个站点可以位于多个连通块中。

考虑直接大力 bfs。直接转移的话复杂度会起飞。发现对于某个站点,如果有颜色在这个站点转移过,那么其他颜色在这个站点转移是不优的,就把这个站点从其他颜色集合里剔除就可以了。

ARC061F Card Game for Three

第一步转化没想到。但是后面的自己推出来了。

首先你要把它转化成一个序列对吧。

我这边的计数方法和其他人的有点不一样。

那么在这个数列里,\(A\) 会出现 \(n-1\) 次,\(B\) 出现不超过 \(m-1\) 次,\(C\) 出现不超过 \(k-1\) 次。且最后一次出现的一定是 \(A\)

那么大力枚举序列的长度。再枚举 \(B\) 的出现次数。

\[\begin{aligned}Ans & = \sum_{len=n-1}^{n+m+k-1} 3^{n+m+k-len} \sum_{i} {len-1 \choose n-2} {len-n+1 \choose i}\\& = \sum_{len-n-1}^{n+m+k-1} 3^{n+m+k-len} {len-1 \choose n-2} \sum_{i} {len-n+1 \choose i}\end{aligned} \]

像上面所说,此时的 \(i\) 有限制。\(i \leq m-1\)\(len-(n-1)-i \leq k-1\)

所以右边实际上是

\[\sum_{i=len-(n-1)-k+1}^{m-1} {len-n+1 \choose i} \]

那么我们记

\[f(l,r,a) = \sum_{i=l}^r {a \choose i} \]

那么我们就想 \(f(l,r,a) \rightarrow f(l+1,r,a+1)\)

考虑做差

\[\begin{aligned}& \ \ \ \ \ f(l+1,r,a+1) - f(l,r,a)\\& = (\sum_{i=l+1}^r {{a+1 \choose i} - {a \choose i}}) - {a \choose l}\\& = (\sum_{i=l+1}^r {a \choose i-1}) - {a \choose l}\\& = (\sum_{i=l}^r{a \choose i}) - {a \choose l} - {a \choose r}\\& = f(l,r,a) - {a \choose l} - {a \choose r}\end{aligned} \]

然后你就可以愉快地递推了。

ARC062F Painting Graphs with AtCoDeer

桥可以随便选。如果边双是个简单环,就是 Polya。如果边双不是简单环,考虑构造出交换任意两条相邻边的方案,答案是本质不同的颜色方案数。

ARC063E Integers on a tree

二分图染色之后,特殊点奇偶性要相等。

注意到每个点会有一个取值范围。这个可以树形 dp 求出。

然后你大力就可以了。

ARC063F Snuke's Coloring 2

跟着 pb 的刷题记录前进!!1。

问题显然等价于求内部没有点(边上可以有)的矩形的最大周长。注意到答案下界是 \(2 (\max(w,h)+1)\),所以目标矩形一定跨过直线 \(x = {w \over 2}\) 或者 \(y = {h \over 2}\)。不然一定达不到下界。

那么只讲跨过直线 \(y = {h \over 2}\) 的情况。枚举 \(x_l\),对于每个 \(x_r\),矩形的上界是 \(y_u = \min\{y_i|x_i \in [x_l,x_r],y_i \geq {h \over 2} \}\),下界是 \(y_d = \max \{y_i|x_i \in [x_l,x_r],y_i \leq {h \over 2}\}\)。这玩意用个单调栈+线段树搞搞就行了。

ARC064F Rotated Palindromes

有一个比较 naive 的想法,首先长度为 \(n\) 的回文串个数有 \(k^{[{n+1 \over 2}]}\) 种。

然后根据这玩意,容斥出极长的长度为 \(n\) 的回文串个数,就是最小循环节长度等于 \(n\) 的。

如果 \(n\) 是奇数,那么每个这样的串都可以循环移位 \(n\) 次。

如果 \(n\) 是偶数,因为 \(AA^T \rightarrow A^T A\),所以只能循环移位 \({n \over 2}\) 次。

ARC066D Xor Sum

考虑 \(f_v\) 表示 \(a+b \le v'\) 的方案数。

然后你考虑

\[[{a \over 2}] \ xor\ [{b \over 2} ] = [{a+b \over 2}] \]

所以你对应最低位的几种情况,就可以搞出

\[f_v = f_{[{v \over 2}]} + f_{[{v-1 \over 2}]} + f_{[{v-2 \over 2}]} \]

ARC066E Addition and Subtraction Hard

这题是 pb 博客的第一题,久仰大名。

发现只有减号后的括号有用。发现一个空位最多放一个括号。发现括号嵌套最多两层。

冲个 dp 就完事了。

ARC068E Snuke Line

首先你有一个显然的想法,枚举 \(d\) 的每个倍数,统计答案。但是这样会算重。

你发现长度不小于 \(d\) 的一定能买到,而长度小于 \(d\) 的不会算重。

那你就指针维护一下就行了。

ARC068F Solitaire

一个合法的双端队列会长成一个 V 字形。前 \(k-1\) 位大概相当于这个 V 字形砍两刀,一刀砍在 k 的旁边,一刀砍在某个异侧点,然后会构成两个单调下降的队列。画图瞪眼可以知道剩余的数一定大于等于队尾的最大值。那么一个这样的方案会有 \(2^{max(0,n-k-1)}\) 种贡献,因为剩下的一部分可以选择从左吃或者从右吃。

\(f_{i,j}\) 表示考虑前 \(i\) 个数,两个单调队列的队尾最大值是 \(j\) 的方案数。

枚举第 \(i+1\) 位放的数 \(k\)。如果 \(k<j\) ,那显然 \(f_{i,j} \rightarrow f_{i+1,k}\)。如果 \(k>j\)\(f_{i,j} \rightarrow f_{i+1,j}\)。这是因为此时只能放没有出现过的最大的数,否则就会不满足上面的条件。

这玩意显然可以前缀和随便优化。

ARC070D No Need

权值太大的就不用管了。容易用背包搞出不使用 \(i\) 的情况下,和为 \(j\) 的方案数。那么只需要看一下 \([k-a_i,k)\) 有没有值就行了。

ARC070E NarrowRectangles

首先可以搞出一个 \(O(n^2)\) 的 dp:设 \(f_{i,j}\) 表示前 \(i\) 个连通,第 \(i\) 个线段的左端点是 \(j\) 的最小代价。

然后你发现这玩意每次的转移是加一个凸函数,所以它是个凸包,并且斜率差距不会太大。

你用优先队列维护一下斜率变化点。具体来说,用一个队列维护负的,另一个维护正的。每次更新相当于 insert 两个斜率变化点进去。最优答案一定会在斜率为 0 的地方取到。注意记录一下偏移量之类的一些奇奇怪怪的东西。

ARC070F HonestOrUnkind

一个初步的想法是找到一个老实人,然后用 \(n-1\) 次询问全问出来。

然后发现找不到老实人。 随机是没有前途的,这辈子都没有前途的(谁叫这是个交互)。注意到 \(b \geq a\) 的时候显然无解,因为可以有一个大小为 \(a\) 的子集强行伪装是老实人。

注意到如果 \(x\) 认为 \(y\) 是假人,那么 \(x\)\(y\) 必然不全是真人。考虑维护一个栈,栈底记为 \(stk_1\)。这个栈需要满足 \(stk_{i-1}\) 认为 \(stk_{i}\) 是老实人。这样的话,这个栈会满足栈底有一段连续的假人,栈顶有一段连续的老实人。直接遍历所有人,设当前人是 \(u\)。如果 \(stk_{top}\) 认为 \(u\) 是老实人,就塞进这个栈里。否则把 \(u\)\(stk_{top}\) 一起扬了。这样操作到最后,栈顶一定是老实人。

ARC071E TrBBnsformBBtion

看到题面第一眼:诶好熟悉,我是不是做过。 后面发现认错题了。

手玩一发,发现 \(AB \rightarrow BA\)。所以可以随意交换位置,那么判一下 \(A\) 的差值和 \(B\) 的差值模 3 的余数即可。

ARC071F Infinite Sequence

注意到如果有两个连续的 \(\geq 2\) 的数就寄了。

\(f_i\) 为长度为 \(i\) 的,第 \(i+1\) 位可以任意放的序列个数。

那么按照第 \(i\) 位的成分考虑,可以有

\[f_i = \sum_{j=0,j \neq i-2}^{i-1} f_j \]

然后考虑计算答案。有一些细节,冷静思考一下就行了。

ARC072D Alice&Brown

打了个表,居然过了 /qd。

ARC072E Alice in linear land

你可以预处理第 \(i\) 次操作之后的位置 \(dis_i\)

那么对于 \(p\),进行这次操作之后的位置会在 \([0,dis_{p-1}]\)。于是你需要保证在这个区间的所有数经过后缀都可以到达 0。

\(b_i\) 表示 \(i\) 的后缀不能到达的最小值。

\[b_i = \begin{cases} b_{i+1} &{b_{i+1}\leq {d_i \over 2}}\\b_{i+1}+d_i & otherwise\end{cases} \]

ARC072F Dam

考虑把体积和热量看成一个二元组 \((V,T)\),合并直接相加就可以了。

显然题目的操作会变成倒水和加水两个过程。我们考虑倒水,如果水能被表示成一个单调降序列,那就直接把序列尾扬了就行。

在加水的时候,如果这个水温比队尾低,就直接扔进去。否则它必须和队尾 mix,直到满足单调降序列为止。

ARC073E Ball Coloring

你考虑最大值和最小值是否在一个颜色里。

如果在的话,剩下颜色随便乱选,最大值和最小值差最小即可。

如果不在的话,对于每个颜色,大的和最大值同色,小的和最小值同色即可。

ARC073F Many Moves

大力搞出转移方程,然后发现这玩意可以分类讨论+线段树优化一下,就没了(。

ARC074E RGB Sequence

容易想到 \(f_{a,b,c}\) 分别表示红,绿,蓝上一个位置分别在哪里。

然后你发现从左往右扫的时候,\(a,b,c\) 中一定会有一个值等于 \(i\)

所以你就记 \(f_{0/1/2,a,b}\) 就行了。

转移的话可以前缀和优化吧。限制直接在 \(r\) 处瞎搞就可以了。

跟 pb 的题解对了一下,应该没啥问题。爽啦!

ARC074F Lotus Leaves

因为点权为 1,正常的想法是把一个点拆成入点出点然后冲网络流。

然后你发现可以对每行,每列分别搞一个辅助节点。

然后没了。

ARC075F Mirrored

这题被某些别有用心的人加强到 \(n = 5000\),扔到小视野上了。

考虑硬点 \(N\) 的长度为 \(len\),然后把竖式列出来。

把数位分组,注意到 \(N\) 的第 \(i\) 位和 \(rev(N)\) 的第 \(n-i+1\) 位是一样的,就记它们是第 \(i\) 组。

\(f_{i,0/1,0/1}\) 表示考虑了前 \(i\) 组,左边有没有进位,右边有没有进位。

直接转移即可。

ARC076F Exhausted?

容易看出这是个二分图匹配。

第一种做法:考虑贪心,正常的想法是按照 \(l\) 排序,能放就直接放。但是这玩意在存在包含的时候是错的。考虑加入反悔机制,用一个小根堆维护当前已经坐下的人里的 \(r\) 最小值。在加进新人的时候,判断新人的 \(r\) 和堆顶的关系。

第二种做法:考虑 Hall 定理。记 \(W(X)\)\(X\) 可以到达的集合。显然 \(\forall X,|X|\leq |W(X)|+k\),所以 \(k \geq |X|-|W(X)|\)。由于边的特殊性,在排序之后取连续的一段一定更优,所以 \(|X|-|W(X)| = |X|-m+minR-maxL-1\)。直接用线段树维护这玩意就行了。

ARC077E guruguru

可以对每次操作分类讨论,哪些会增加多少。

注意到每次贡献之间独立,所以不需要线段树,直接差分就行了。

ARC077F SS

原题给了个 \(SS\),设 \(S\) 的长度是 \(n\)。如果 \(S\) 存在循环节 \(len|n\),那显然是偶数个 \(len\) 疯狂循环,这部分是容易的。

如果没得循环节,设 \(T = S[1,n-nxt_n]\),那么 \(S \rightarrow ST \rightarrow STS \rightarrow STSST\)。证明的话只需要判断 \(|S|-nxt_{|S|}\) 就可以了。注意到这玩意是个斐波那契的形式,直接递推就可以了。

ARC078E Awkward Response

好哇,交互题。口胡一发。

首先你可以通过 \(\log_2 ({ \log_{10}n})\) 发询问搞出 \(n\) 的十进制位数。

然后你尝试用字典序的性质搞出点什么。构造一个数 \(x\),满足 \(x>>n\),而且不怎么影响字典序,实现方法是往 \(x\) 后面塞 0 就可以了。然后应该可以每一位二分出具体的值吧。

总的询问次数应该是 \(\log_2 (\log _{10} n) + ({\log_{10} n})(\log_2 10)\)

跑去你谷题解区看了一眼,觉得老年选手的做法很有道理!

ARC078F Mole and Abandoned Mine

我来胡一胡。/cy。注意到最后的图的形态会是一条链,周围挂着一些互不连通的连通块。

\(f_{S,i}\) 表示当前与链连通的集合是 \(S\),联络点(往外界连通的点)是 \(i\)。转移就枚举下一个联络点,再枚举一个连通块,然后硬点这个连通块并不能往 \(S\) 内点连通。时间复杂度是 \(O(3^n poly(nm))\) 的,当然非常容易优化到 \(O(2^n poly(nm))\)

我草,我太牛逼了,我胡出来了。

ARC079D Decrease (Contestant ver.)

手玩了一发,发现长度为 \(n\)\(x,x,x,x,x\) 可以通过 \(n\) 次操作变成 \(x-1,x-1,x-1,x-1,x-1\)

所以直接大力搞 \(n = 50\),然后还会剩下一些余数,看哪个能丢就丢哪里。

ARC079E Decrease (Judge ver.)

一个数一定会被删若干次,删完之后还会受到其他数的影响增加。

所以直接重复这个操作 \(O(\log)\) 次就行了。(我为了保险搞到了 2e5)。

ARC079F Namori Grundy

你会整出一个基环外向树。每个点的权值是它指向的点的 \(mex\)

你发现树上的点的权值是确定的,可能不同的就是环上的值。如果确定了环上的某个点,环的权值就确定了。

然后你脑子一抽,发现 \(a_u\) 只有两种取值,一种是 \(mex\),一种是 \(mex'\)(第二个没有出现的值)。(我口胡的,应该是对的吧)。

直接 dfs 就行了。

ARC080E Young Maids

想出了一个 ST表+启发式归并 的鬼做法。大概就是对于每个序列,找出字典序最小的“合法对”,然后把他们扔到最前面。这个时候序列会分裂成不超过 3 个子序列,这 3 个子序列优先级相等,递归下去然后启发式归并。

看了一眼题解并不需要启发式归并。每次把可操作区间扔进一个堆里就行了(反正他们优先级相等)。

ARC080F Prime Flip

因为之前见过类似的题,考虑差分。那么相当于可以取反两个差为质数的位置。你发现把它们两两配对,可以用哥德巴赫猜想搞出下界是 \(n\)。然后答案的减少量等于一般图最大匹配 我直接 tutte 矩阵。 哦它不是一般图,它是奇偶性不同的二分图(。

然而你发现上面这个算法在 \(n=2\) 的时候有点小锅,特判一下就行了。

ARC081E Don't Be a Subsequence

有一个比较显然的 bfs 贪心做法。

ARC082F Sandglass

没玩出来,忍不住去看了 pb 的题解。(复读机)。/kk。

考虑一次翻转的过程,要么是 \(x \rightarrow min(x+t,X)\),要么是 \(x \rightarrow max(x-t,0)\)

于是就是一个一次函数向上敲一敲,向下敲一敲,最后会变成两边平中间斜的样子。

ARC083E Bichrome Tree

\(f_u\) 表示当 \(u\) 是白色时,黑色权值最小值。\(g_u\) 表示当 \(u\) 是黑色时,白色权值最小值。

那么一个点要么是 \((s_u,f_u)\),要么是 \((g_u,s_u)\)。转移类似一个 01 背包。

跟校内 OJ 题解对了一下,应该没问题。

ARC083F Collecting Balls

对于一个球,把对应行列连无向边。容易发现一定会连出来一个基环树森林,否则无解。每个点代表一台车,每个边代表一个球,所以每个点必须有一条出边,把那个球创死拿掉。可以发现树上的边的方向是确定的,环上可能有两种情况。

再考虑题目条件。发现如果 \((x,0) \rightarrow (x,y)\),那么一定 \(\forall i<y,(x,i) \ is \ already \ deleted\),所以把有限制关系的车之间连边。这样连出来是个 DAG?然后你要求 DAG 的拓扑序个数?

显然不是直接求 DAG 拓扑序个数,你要是会 poly 做法可以直接发论文(。你发现一个点最多只有一条出边,所以这是一棵内向树。这就好办了。不管你是 打表 dp+归纳证明还是感性组合意义理解,内向数的拓扑序个数就是 \(n!\prod {1 \over size_u}\)

ARC084D Small Multiple

直接同余最短路吧。\(u \rightarrow (u*10+j) \% n,weight \ j\)

ARC084E Finite Encyclopedia of Integer Sequence

如果 \(k\) 是偶数,答案就是 \({k \over 2},k,k,k,k,...,k,k\)

如果 \(k\) 是奇数,答案看起来是 \({k+1 \over 2},{k+1 \over 2},{k+1 \over 2},{k+1 \over 2},...,{k+1 \over 2},{k+1 \over 2}\) ...吗?注意一个变换 \(f(A) : a_i \rightarrow k+1-a_i\),这个变换在原答案的前缀会失效,然后你发现它恰好有 \({n-1 \over 2}\) 个,直接暴力回退就行了。

ARC085E MUL

因为数据范围很小,所以乱搞可以过 /mgx。

正解是最大权闭合子图。

ARC086E Smuggling Marbles

每一层的石子之间互不影响。考虑建出一棵虚树。这个时候你发现答案跟虚树边长度无关,只跟树的结构有关,就当做无事发生。可以记 \(f_{u,0/1}\) 表示 \(u\) 的子树内,\(u\) 上有无节点的方案数。

ARC087E Prefix-free Game

打了个表,发现对于深度为 \(x\) 的二叉树,\(\text{SG}(x) = \text{lowbit}(x)\)

然后把 trie 树建出来就可以了。

ARC088E Papple Sort

每个字母之间的相对位置不会变,即一定是首尾两两配对。考虑把每个字母最终去到的位置求出来,就是一个简单的逆序对问题。

对于任意不包含两对 pair,感性证明可以随便放。

ARC090E Avoiding Collision

首先把最短路图建出来。两个人在路上最多只会在一个瞬间相遇。考虑容斥,对于每个可能相遇的点和边,算一下两边能到的方法就行了。

ARC091F Strange Nim

打表找规律失败了 /fn。

有牛逼老哥找出

\[\texttt{SG}(n,k) = \begin{cases} 0 & n=0 \\ {n \over k} & n \%k == 0 \\ \texttt{SG}(n-[{n \over k}] -1,k) & n \% k \neq 0 \end{cases} \]

然后就做完了。

证明用归纳法。

ARC092D Two Sequences

从大到小考虑每一位,判断这一位是否为 1。

那么只需要计算这一位为 1 的和的个数就行了。这玩意可以 sort 之后 lower_bound 出来。每次统计完一位就把这一位扔掉。时间复杂度是两个 log 的。

ARC092E Both Sides Merger

注意到 2 操作并不会改变奇偶性,所以最后的答案是奇数位最值或者偶数位最值。然后贪心即可。

至于输出方案,因为相邻两个选中的数中间一定隔着奇数个数,就不断调用 2 操作。

ARC093E Bichrome Spanning Tree

先驲出原图一个生成树,权值记为 \(t_0\)。然后对每条边,搞出强制选 \(i\) 的最小生成树,权值是 \(t_i\)

如果 \(t_i < x\) 或者 \(t_i > x\),那就没贡献。

否则乱搞。

ARC095E Symmetric Grid

一开始还以为是啥牛逼题,各种分析,然后做不出来,交了一个只会证必要性的暴力上去,发现还过了挺多点的(。

乱搞题,顺便去学了一手模拟退火

ARC095F Permutation Tree

有解会长成一条直径上挂着一堆点。正反跑两遍贪心就可以了。

ARC097E Sorted and Sorted

\(dp_{i,j}\) 表示放了前 \(i\) 个白色,前 \(j\) 个黑色的最小代价。

转移用一个辅助 dp 就行了。

ARC098F Donation

\(c_i = max(0,a_i - b_i)\)。按照 $c_i $ 建 \(kruskal\) 重构树。把过程看作每到点 \(u\) 就能获得 \(b_u\) 块钱。发现设 $f_u $ 是 \(u\) 的子树内能到达 \(u\) 的最小花费。因为 \(c_u\)\(u\) 子树里最大的,所以到 \(u\) 时的钱数就是 \(\sum_{v \in tree_u} b_v\)。可以直接树形 dp。

ARC099D Snuke Numbers

打了个表,发现这玩意长得非常奇怪,大概是后面有一坨 9。瞪眼法可以看出它们每次只加 \(10^k\) 并且这玩意单调不减。就写了个贪心,然后过了:)。

ARC099E Independence

czy 祸害小朋友!!!11

考虑转化为补图,分成两个独立集。显然合法的方案当且仅当原图是二分图。背包选择最平均的分法即可。

ARC099F Eating Symbols Hard

czy 祸害小朋友!!!11

考虑构造哈希函数

\[F(p) = \sum_i p_ix^i \]

发现题目条件等价于

\[F(p_r) - F(p_{l-1}) = F(p_n) x^{pos_{l-1}-pos_0} \]

其中 \(p_i\) 是第 \(i\) 时刻的序列,\(pos_i\) 是第 \(i\) 时刻指针的位置。随便做。

ARC101D Median of Media

当场二分答案,然后把大于搞成 1,等于的搞成 0,小于的搞成 -1。区间的和大于等于 0 就是答案。然后你大力开冲。

ARC101F Robots and Exits

把一个点抽象成二元组 \((x,y)\)。发现如果从左边出,\(x\) 一定单调不降。并且状态 $(x,y) $ 可以转移到状态 $(x,y+1) $ 和 \((x+1,y)\)。可以把操作看成一个折线,折线下方的就是从左边出,上方的就是从右边出。

\(f_i\) 表示前 \(i\) 个点,最后一个从左边出的点是 \(i\) 的方案数。发现是个二维偏序,直接开冲。

ARC102E Stop. Otherwise...

观察样例,目测答案上半部分和下半部分是一样的,中间夹了一个 \(k+1\)。仔细想一想发现一一对应。于是就只考虑 \(i \leq k\) 的答案以及 \(i = k+1\) 的答案。

对于一个 \(i \leq k\),注意到 \(\geq i\) 的数可以随便乱选,考虑枚举有 \(j\) 个数 \(< i\)。发现其实是把 \(j\) 个数扔进 \([{i \over 2}]\) 个集合里,有些集合有乘二的贡献,这玩意大力 dp 就行了。注意奇偶性分类讨论。

搞出上面这个 dp 之后,\(i = k+1\) 就可以随便做了。

ARC107D Number of Multisets

\(f_{i , j}\) 表示 \(i\) 个数和为 \(j\) 的方案数。\(f_{i,j} = f_{i-1,j-1} + f_{i,j\times 2}\)

ARC107E Mex Mat

打了一堆表,找不到规律,然后摸了去看 pb 的 Atcoder 做题记录,不小心看到了这题题解,我有罪(。

\(\forall i,j >4,a_{i,j} =a_{i-1,j-1}\)

证明?全网都没找到特别详细的吧。找到的好像都是暴力枚举所有 4x4 的情况,然后就搞出 \(a_{4,4} = a_{5,5}\)

ARC111E Simple Math 3

《关于随机刷 ARC 刷到类欧几里得板子这件事》。

一开始想根号分治,然后假了。

看了一眼题解,顺便去学了类欧几里得 /cy。

ARC114E Paper Cutting 2

一开始想着把横竖的贡献拆开,然后枚举操作次数算期望。数量可以比较轻松地卷积出来,但是概率非常难算,假了。

正解是考虑期望的线性性,对于每条边计算它的贡献。一条边产生贡献,当且仅当矩形内部边比它先被割掉,并且它跟矩形的边也被割掉。感觉还是挺刺激的。

ARC115D Odd Degree

首先考虑每个连通块的答案,然后分治 NTT 合并就行了。

设连通块大小为 \(n\),有 \(m\) 条边。如果这个连通块是一棵树,那么 \(ans_k = [k \%2==0]{n \choose k}\) ,证明的话,每个点可以根据它父亲那条边调整。

考虑不在生成树上的边的任意一种组合,那么每个点也可以用跟它父亲的边调整。所以 \(ans_k = [k \% 2 == 0]{2^{m-n+1}}{n \choose k}\)

ARC115E LEQ and NEQ

考虑维护 \(dp_{i,j}\) 表示第 \(x_i = j\) 的答案。

毛估估一下,发现相当于要实现区间取负,区间加,区间求和。

大力冲个线段树就完事了。

跟 SSRS 的代码对了一下,应该没问题。

不是很能懂其他题解的什么神必容斥。

ARC116E Spread of Information

考虑二分答案。判断一个距离需要的点的数量。

有一个比较神必(常见)的贪心方法,也跟之前做过的一题很像,维护每个点向下需要多少,或者向上可以贡献多少。转移是一个比较简单的分类讨论。

感觉这种贪心方法还是要写个暴力拍一下正确性,非常容易暴毙。

ARC116F Deque Game

首先解决 \(k = 1\) 的情况,容易发现这是一个关于先手和奇偶性的分类讨论。

操作相当于抢一个序列。直接按权值的差排序即可。

ARC118F Growth Rate

正着想会暴毙,考虑倒着想,设 \(f_{i,j}\)\(x_i = j\),且满足 \([i,n]\) 的限制的方案数。转移是个后缀和的形式,所以 \(f_{i,j}\) 一定是一个 \(n-i+1\) 次多项式。大力拉插维护点值即可。

ARC121F Logical Operations on Tree

发现操作顺序一定是先操作 and 再操作 or。计算不合法的方案,注意到如果有一条边是 or,且两边的一个连通块可以被操作成 1 ,就一定合法。

设 $dp_{u,0} $ 表示 \(u\) 的子树内,\(u\) 能被操作成 0,\(dp_{u,1}\) 表示 \(u\) 能被操作成 \(1\) 且不存在 \((or,1)\)。随便转移。

ARC126E Infinite Operations

妈的,不知道为什么答案就是 \({1 \over 2} \sum {|a_i - a_j|}\)

没意思。

ARC127E Priority Queue

这里是一个跟 std 不同的做法。考虑一个什么样的集合是合法的。考虑从大到小插入,设 \(dp_{i,j}\) 表示考虑了 \([i,A]\) 的数里选 \(j\) 个的方案数。直接转移,但是要判合不合法。具体的判定是考虑贪心插入被删去的 \(A-i+1-j\) 个数,这些数一定会要被某些删除抵消,看插入这些数之后能不能使剩余集合大小为 \(j\)。不想讲了,具体实现可以看我 submission(。

ARC127F ±AB

这个神必符号我不会打。

大力观察或者手玩或者口胡,发现如果 \(A+B \leq M+1\),一定可以搞出所有的值。

考虑 \(A+B>M+1\) 的情况。发现只有两种操作方法,分别是 \(+A-B\)\(-A+B\),两种都是哪个方向合法用哪个。很容易证明,这两种方法一定可以遍历所有合法的点,并且不重复。

以第一种为例,我们想要求出最小的 \(p\) ,满足 \((V+pA) \mod B>M-A\),在这种情况下,一共走了 $k+\lfloor {V+k*A\over B}\rfloor $ 步。令 \(V_0 = V \mod B\),特判 \(V_0 > M-A\) 。问题转化为求最小的 \(p\),使 \(pA \mod B \in [L,R]\)。令 \(B=qA+r\),问题转化为求最小的 \(q\),使 \(qr \mod A \in[(-R)\mod A,(-L) \mod A]\)。递归求解再带回即可。

ARC130D Zigzag Tree

大力设 \(dp_{u,i,0/1}\) 表示 \(u\) 是 0/1 种点,在子树内排名为 \(i\)。转移大力树上背包就行了。

ARC132E Paw

最终得到的状态一定是左边一串往左,右边一串往右,中间两个洞之间没有被覆盖。证明可以直接用反证法。

得到满足这样一串的方案数是 \(f_i = {2i-1 \over 2i} f_{i-1}\)

ARC132F Takahashi The Strongest

把字母看作 1,2,3。构造串 \(M(i,j)\),如果 \(a_{i,d} = b_{j,d}\)\(M(i,j)_d = a_{i,d}\)。否则 \(M(i,j) _d = 0\)。定义 0 是 1,2,3 的子集,1,2,3 互不包含。

我们想要对每个串 \(S\) 求出答案,等价于对串 \(T\) 求出所有 \((i,j)\) 的个数,满足 \(T\)\(M(i,j)\) 至少一位相同,其中 \(T\) 是每把都被 \(S\) 击败的字符串。

\(cnt_S\) 表示 \(\sum\limits _{i,j} [M(i,j) = S]\)。发现变换矩阵是

\[\begin{bmatrix} 1 \ 0 \ 0 \ 0 \\ 1 \ 1 \ 0 \ 0 \\ 1 \ 0 \ 1 \ 0 \\ 1 \ 0 \ 0 \ 1 \end{bmatrix} \]

那逆矩阵就是

\[\begin{bmatrix} 1 \ 0 \ 0 \ 0 \\ -1 \ 1 \ 0 \ 0 \\ -1 \ 0 \ 1 \ 0 \\ -1 \ 0 \ 0 \ 1 \end{bmatrix} \]

直接高维前缀和即可。

求出 \(cnt_S\) 之后再做一次高维前缀和即可得到答案。

ARC137F Overlaps

老师推的题,看了两天!不会做!

显然这个实数的条件是用来吓人的。发现长为 2n 的合法括号序列总数是 \(\prod_{i=1}^n (2i-1)\),非常好算。问题转化为计算长度为 \(2n\)\(maxsum \leq k\) 的括号序列数。

\(x_i\) 为第 \(i\) 个右括号之前的前缀和(不算它自己),那对于一组合法的 \(x\),答案贡献就是 \(\prod x_i\)

发现 \(x\) 需要满足

\[\forall i \in [1,n],x_i \leq k \\ \forall i \in [1,n-1] ,x_i \leq x_{i+1}-1 \\ x_n = 1 \]

考虑容斥第二个条件,计算 \(F(x)\)

\[[x^n]F(x)= \sum_{leny=n} \prod_{i=1}^{n} y_i \]

其中的 \(y\) 满足

\[\forall i \in [1,leny-1],y_i \leq y_{i+1}-2 \]

这部分可以在值域上分治,记录值域两端有没有被选择,直接卷积。也可以把转移写成矩阵的形式之后插值。

发现一个合法的 \(x\) 序列是若干个 \(y\) 序列拼起来,并且最后一段需要特殊考虑。

套个容斥的壳子搞定。

ARC139D Priority Queue 2

把删掉第 \(x\) 小改成保留 \(n-x+1\) 大。考虑枚举值域,计算 \(\geq i\) 的数的个数。

硬点加进来几个 \(\geq \ i\) 的数,可以直接算。

ARC140F ABS Permutation (Count ver.)

老师推的题,不会做!

先考虑 \(m=1\) 的情况,发现可以在 \(i\)\(i+1\) 连边,形成若干条链。考虑硬点有 \(j\) 条链,如果链的长度大于 1 就可以翻转。并不考虑它们的顺序。

考虑 dp,\(f_{i,j,0/1}\) 表示在前 \(i\) 个里选了 \(j\) 条边,点 \(i\) 形成的链长度是 1(0) 还是大于 1(1)。

\[2f_{i,j,0} \rightarrow f_{i+1,j+1,1}\\ f_{i,j,0} \rightarrow f_{i+1,j,0} \\ f_{i,j,1} \rightarrow f_{i+1,j+1,1} \\ f_{i,j,1} \rightarrow f_{i+1,j,0} \]

\(F_0(i)\)\(F_1(i)\) 为关于 \(j\) 的生成函数,发现:

\[F_0(i+1) = F_0(i)+F_1(i) \\ F_1(i+1)=2xF_0(i)+xF_1(i) \]

把转移写成矩阵的形式

\[\left[\begin{matrix}1,1\\2x,x\end{matrix}\right]\left[\begin{matrix}F_0(i)\\F_1(i)\end{matrix}\right]=\left[\begin{matrix}F_0(i+1)\\F_1(i+1)\end{matrix}\right] \]

带单位根进去就可以搞出 \(F\) 的系数。最后二项式容斥一下就行了。

对于 \(m>1\) 的情况,会划分成若干互不干扰的链。所以把一堆生成函数卷起来,最后二项式容斥一下就行了。

ABC225H Social Distance 2

\(k\) 的限制相当于把序列分成了 \(k+1\) 个块。相当于要算三个值:两边贡献都算,算一边贡献,两边贡献都不算。

\[u = \sum_{i=0} x^i = {1 \over 1-x}\\ v = \sum_{i=1}ix^i = xu^2\\ f_{n,i} = [x^n] v^{i+1} = {n+i \choose 2i+1} \\ g_{n,i} = [x^n] v^i {1 \over 1-x} = {n+i \choose 2i}\\ h_{n,i} = [x^n] v^{i-1}{1 \over 1-x} = {n+i \choose 2i-1} \]

那就分治 NTT 卷起来就行了。

ABC231G Balls in Boxes

很激动啊,爆 std 复杂度了啊。(好像我几个月之前还不会这题来着)。(好像这种简单题爆 std 也没啥好激动的)。

首先把 \(k!\) 提出来,发现你大概要求这个东西

\[\begin{aligned} \ & \ \ \ \ \ \ [x^k] \prod _{i=1}^n (\sum_{j=0}^k {a_i + j \over j!}x^j) \\ & = [x^k] \prod_{i=1}^n (\sum_{j=0}^k {a_j \over j!} x^j + x \sum_{j=0}^{k-1} {1 \over j!} x^j)\\ & = [x^k] \prod _{i=1}^n (a_i e + xe) \\ & = [x^k] e^n \prod _{i=1}^n (x+a_i) \end{aligned} \]

很漂亮啊!直接暴力提取系数就做完了啊!好耶!

ABC236H Distinct Multiples

you ren zhen de hen dong zuo ti xiao qiao men: gao beng zi ji xin tai zhen de niu bi wo tu le.

ABC239H Dice Product 2

按照题目的意思写出式子

\[f_i = 1+ {1 \over n } \sum_{j=1}^n f_{ij} \]

然后你不知道为什么,乘到 \(m\) 等价于从 \(m\) 开始除。

\[g_i = 1+{1 \over n}\sum_{j=1}^n g_{[{i \over j}]} \]

然后整除分块,做完了。

ABC241Ex Card Deck Score

写出生成函数 : \([x^m] {\prod {1 - (a_ix)^{b_i+1} \over (1-a_ix )}}\)

那么分子可以硬点哪个集合选,把 \(1\) 消掉。

考虑分母,可以把 \(\prod {1 \over (1-a_ix)}\) 写成 \(\sum {c_i \over 1-a_i x}\),具体证明可以看这里。然后把后面这玩意拆开,就可以算了。

ABC242Ex Random Painting

\(S \subset \{(l_i,r_i)|i \in [1,m]\}\)。记覆盖了 \([1,n]\) 的集合为合法。

那么停时等于所有非法集合的出现概率乘上跳出期望。

把区间排序,设 \(dp_{i,j,k}\) 表示考虑前 \(i\) 个区间,覆盖了 \([1,j]\) ,用了 \(k\) 个区间的合法集合数量。暴力转移即可。

ABC243G Sqrt

打表或者不打表都能知道 \([x^2,(x+1)^2)\) 之间的答案是一样的。

直接暴力模拟即可。注意值域过大的时候 std::sqrt 会有点问题,需要自己手动调整一下。

ABC244G Construct Good Path

找个生成树,在上面乱走。奇偶性不对了就和父亲反复横跳。如果根的奇偶性不对了就跟一个儿子反复横跳。

ABC245G Foreign Friends

dijkstra 板子,记两个不同国家的就行了。

不知道为啥我一开始没看出来。

ABC247G Dream Team

一开始以为这题不弱于一般图最大权独立集,觉得挺抽象的。

看了眼数据范围。哈哈,这不就是 MCMF 板子吗 /流汗黄豆。

ABC248G GCD cost on the tree

考虑点分治,对于每个 rt,把子树内的每个点到 rt 的 gcd 预处理一下。之后就是一个高维前缀和问题了。

我草。题解有个很牛逼的做法。\(\sum\limits_{d|n}\varphi(d) = n\),所以枚举每个 \(d\),用 \(\varphi(d)\) 计算答案就行了。我草,牛逼。

ABC250G Stonks

注意到一买一卖相当于啥也不干,是合法的。我的想法是建一棵笛卡尔树,从小到大开始每个节点找到离它最近的没标记过的祖先,如果能找到就加上这两个点的贡献,然后把祖先标记。找不到这个儿子就废了。最后如果有深的点被标记,浅的点没被标记,就加一下这两个点之间的贡献,相当于把标记点往上提。

题解里似乎没有我这个做法。

它给的是另一个折线维护断点的做法。其实这个做法我也想到了,也猜到了结论,但是感觉不是很稳,就没有仔细想。复健之路任重道远。

ABC252G Pre-Order

显然的区间 dp 还是比较好想的。两个状态分别计算一个区间内单根树和多根树的数量,直接维护就行了。

官方题解给的 solution2,感觉本质上跟区间 dp 差不多。

ABC253G Swap Many Times

首先暴力把前后散块搞定,接下来考虑如何搞整块。

手玩就行了。

posted @ 2022-02-13 16:51  ZSH_ZSH  阅读(459)  评论(8编辑  收藏  举报