AGC001~030 合集

news/2025/10/21 20:41:31/文章来源:https://www.cnblogs.com/CarroT1212/p/-/AGC1

2025.3.10 - 2025.10.21。

如果附带了题目大意的话就是最近才做,或者是我过了几个月看不懂自己写的啥了重写了一遍。

如果您认为某些题目的理解不够到位,非常欢迎交流!!/kel,虽然应该也不会有人仔细看。

4.5,*???? 构造 AGC001D Arrays and Palindrome

回文能提供的信息只有回文匹配的位置相同。我们要用两组回文信息把所有位置连接起来。

考虑到出题人是人,所以考虑一些结构没有特别复杂的构造。比如我们可以以下几种方式把一个连续段全部串起来。偷第一篇题解的图。

那么把奇数 \(a_i\) 往两端放,中间全偶数,然后用这样的接口结构串起来,我们就得到了不超过两个奇数的解。

下证超过两个奇数一定无解。

\(a\) 里有 \(O_a\) 个奇数,\(b\) 里有 \(O_b\) 个奇数,那么上图的弧总共会有 \((N-O_a)/2+(N-O_b)/2\) 种。显然如果要全部连起来这个数字至少要达到 \(N-1\)。那就要求 \(O_a+O_b\le 2\)

3.5,*???? 组合DP AGC001E BBQ Hard

考虑式子的组合意义。相当于有很多个 \((-A_i,-B_i)\)\((A_i,B_i)\)。计算从 \((-A_i,-B_i)\) 走到 \(i<j\)\((A_j,B_j)\) 的方案数之和 \(/2\)

不考虑 \(i<j\) 的限制,直接 DP 然后扣掉 \(i=j\) 情况再 \(/2\) 即可。

有代数推导做法。以后可以学学。

5.5,*2889 博弈 AGC002E Candy Piles

把堆按大小排序。那么操作分别为消下面一行和消左边一列。转成左下角向上或向右移动,然后就可以比较平凡地分析必胜情况了。

4,*3300? DP AGC002F Leftmost Ball

考虑如何去重。我们把每个 \(0\) 绑定到最先和其匹配上的颜色上。也就是,第 \(i\)\(0\) 和第 \(i\) 个出现的颜色匹配,并且要求每个颜色的第一次出现在它匹配到的 \(0\) 后。

这启示我们仅关心颜色的初次出现顺序而不是它们的值。那就假设颜色顺序是 \(1\to n\),最后答案 \(\times n!\) 即可。

这个 DP 是容易的。

3.5,*2983 adhoc AGC003E Sequential operations on Sequence

其实不难。首先把 \(p_i\ge p_{i+1}\)\(p_i\) 全部杀掉。于是我们认为 \(p_i\) 全程是递增的。

然后每次相当于把 \(A_{i-1}\) 复制 \(p_i/p_{i-1}\) 遍然后加上一个 \(p_i\bmod p_{i-1}=d\) 的前缀。复制部分简单,考虑这个多出来的前缀应该怎么处理。

发现这个前缀生成的位置就在 \(A_{x}\ge d > A_{x-1}\) 的第一个 \(x\),并且之后这个前缀再也不会变动了。所以多出来的前缀问题可以直接等价到 \(A_x=d\)\(A_{x-1}\to A_x\) 的情况,递归做下去即可。每次 \(d\) 会减去至少一半,所以二分找 \(A_x\) 的话可以做到 \(O(n\log^2 n)\) 的复杂度。

3.5,*3344 矩阵幂 AGC003F Fraction of Fractal

因为保证单位分形四联通,所以上下左右都接上的情况和都没接上的情况都很容易。

现在考虑只有上下或者只有左右接上的情况。钦定是左右。

很明显竖向的怎么都连不起来,所以只考虑横向的联通。那连通块数就是经典的点数减连边数。点数好算,边数……

考虑每次分形多出来了多少边。可以发现这个数字其实就是每次乘上了最开始的循环相接位置数。所以用矩阵幂优化下这个递推即可。

(#)7.5,*3986 图论 AGC004F Namori

首先考虑树的部分分。一个 trick 是同色匹配一般是没有异色匹配好做的,考虑变成异色匹配。所以考虑把树画成二分图的形式,翻转一边的点的颜色。那么操作就变成了,每次将一个黑点往一条边移动。要把黑点从左部点全部移到右部点。如果左右部点个数不同就寄了。

这个问题很容易。每条边被经过的最小次数是可以取到的,并且经过方向肯定每次都相同,所以算出来就行了。然后这题的式子还比较特殊,因为目标是点的颜色全部取反,所以答案就是每棵子树里黑白点个数差的绝对值 \(|v_i|\) 之和。

然后考虑基环树。

如果是个偶环,那么还是二分图。环上的每棵树都是确定会进去/出来多少个黑点的。需要找到一种把进出黑点匹配起来并且总距离最小的方式。

玩一下发现不存在什么一定有条边没被经过的性质,所以考虑看成树上加了一条边。

经过这条边的黑点方向是确定的。考虑设其次数 \(x\),那就等价于某一侧的黑点数加到了另一边去。这给 \(v_i\) 带来的变化是,环上边对应的所有远向点 \(+x\)。这时的答案是关于 \(x\) 的若干线性绝对值函数的加和(\(x\) 可为负),所以根据经典结论取中位数即可。

如果是个奇环,先把奇环上的一条边拿掉变成树。这条边可以被操作仅当,它两端的颜色相同,然后可以每次加两个或者丢两个黑点。

发现它可以解决左右部点个数不同时的问题。所以可以在过程中随时操作这条边使黑点数 \(+2\)\(-2\)。那么把这条边的操作数分两半加到两头的 \(v_i\),不管这条边做树的情况即可,最后算上 \(|\frac{v_i}{2}|\)

6.5,*2996 期望 AGC006C Rabbit Exercise

不会做就把式子写出来!!

\(i\) 兔子位置在 \(x_i\)。那么兔子 \(p\) 跳一下期望会到 \(\frac{2x_{p-1}-x_p+2x_{p+1}-x_p}{2}=x_{p+1}+x_{p-1}-x_p\) 去。然后意识到期望有可加性。所以上面的东西都能换成期望。

\(M\) 轮还不是很好做。但仔细一看这式子不是和 NOIP2022 T3 一模一样吗,直接把 \(x\) 差分!然后就变成交换两个 \(dx_i\),直接置换环上考虑即可。

6,*3101 构造 AGC006E Rotate 3*3

显然奇数列和偶数列是不互通的,而且每一列的元素一定都会全程绑在一起,只是方向不知道。先把一些连这些条件都不符合的情况杀掉。

手玩出一些基本操作试试。

你发现你有办法把任意两个间隔两位的列反向(中间的直接两边轮流操作三次,靠边的就操作旁边然后连着把附近四个同时翻转)。

所以如果列上的数已经归位,只是方向没定,那么奇偶列各自的反向列数为偶数的时候一定有解。奇数的时候显然是没法办的。

然后考虑归位需要经历什么。每次你可以对某个奇偶性的列单独做一个邻项交换,然后把对面的其中一位取反。显然不管怎么交换,对面被取反的次数奇偶性都是固定的。所以直接算逆序对数奇偶性即可。

5,*3530 图论 AGC006F Blackout

是一种连三元环的结构。那就对弱连通块尝试三染色。

染色失败那么弱连通块会被连成完全图(包括自环)。染色成功就是分色连边。

(#)7.5,*3379 期望 AGC007C Pushing Balls

首先操作等价于,\(2n-1\) 个位置,每次随机删掉相邻两个,问删掉的两个位置距离之和是多少。

距离为等差数列这个性质显然非常奇怪。事实上存在强行根据括号匹配刻画的做法,但是完全超出了我的推式子水平。

考虑利用期望性质。一个非常非常牛逼的思路是,考虑等差数列的求和,我们把每一段距离倒过来接在一起!然后每一段距离就变成了相等的,然后很明显,每一段距离的贡献次数不会变化!所以根据期望线性性砍一半就是答案了。所以现在我们可以假定 \(d_1=1,x=0\),即每一段长度相同。

然后再感受一下期望的性质。每次删掉两个相邻位置之后,会有三段距离被合并起来,或者是两段距离原地消失。如果是前者,这段距离出现在每个位置的概率都相同。如果是后者,剩下的段没有受到影响。

所以,每次删完,每一段的期望长度都相等!

直接求这个长度即可。事实上如果不做开头那个等差数列转化,那么结论会变成,每一段的期望长度保持形成等差数列,也是可以做的,硬推式子即可看出。

5,*3906 DP AGC007E Shik and Travel

显然需要二分答案。然后题目要求的是 dfs 序,所以无需考虑某些反复横跳情况,其实也不会更优。

可以设计 DP \(dp_{i,l,r}\) 是否有办法在 \(i\) 子树里第一个走到的叶子距离 \(i\)\(l\),最后一个距离 \(i\)\(r\)。转移直接把 \(r+?+l+?\le mid\) 的合起来即可。

然后考虑优化。显然 \(dp_{i,l_2,r_2}\) 一定不优于 \(l_1\le l_2,r_1\le r_2\)\(dp_{i,l_1,r_1}\)。那这时 \(r\) 一定随 \(l\) 的递增而递减,并且状态数少了个 \(n\)

单调性使得我们可以做一些双指针操作。把要合并的两棵子树按 \(l\) 排好序,然后就可以实现状态数的时间复杂度了。

然后此时你需要意识到一个事情,就是刚刚那个优化不止让状态数少了个 \(n\)。显然你可以使用类启发式合并的操作做那个合并,然后状态数就是单 \(\log\) 的了。完事。

(#)5.5,*3559 分讨 AGC008E Next or Nextnext

考虑如果有一个 \(p\),它能生成什么样的 \(a\)。把 \(i\to p_i\) 连边。对每个环考虑 \(i\to a_i\) 长什么样。

如果这个环内全部 \(a_i=p_i\) 就不变。全部 \(a_i=p_{p_i}\) 的话,偶环会分裂,奇环会重排。

否则易证一定会生成一整棵基环树。现在可以找到 \(i\to a_i\) 里的所有基环树连通块,然后看它怎么变回 \(i\to p_i\)

首先基环树里的每棵子树都是链(或者说没有四度点且所有三度点都在环上),不然环边就没地方连了。然后问题变成要把这些链塞到环里使得环链交替且不和上一条链的区域相交。方案数容易计算。

自己想时的思路比较依靠手玩和猜。

几乎自己推出来了,但还是在最后一步脑子过载原地暴毙。/tuu

考虑对 \(a_i\) 建图。里面会有一些环和基环树。

先考虑简单一些的环。如果 \(p_i\) 也存在一个点集相同的环,手玩得,非自环的奇环有两种方案,否则有一种。

但是 \(p_i\) 可以在两个环中间反复横跳。不过你发现这个时候它两个环大小肯定是相同的,所以简单计算一下即可。

然后考虑基环树。显然 \(p_i\) 的图里必须存在一个点集完全相同的环。

如果基环树上有“树”而不是链的话,手玩一下肯定寄了。然后考虑这些链。

有这么一种理解方式:手玩可得这个时候环本身一定是要按顺序遍历的,那么我们要把链交替插在它连接的环点的前面一段。于是就有办法完成方案数的计算了。

(#)8,*3995 图论 AGC008F Black Radius

一棵全白的树上有若干关键点。你可以选择将一个关键点的 \(d\) 级以内邻域染黑。问最后有多少种树的形态。\(n\le 2\times 10^5\),有全树为关键点的部分分。

看全关键点的部分分。问题在于因为一些 \(d\) 级邻域可能被叶子卡掉,导致不同的 \(x,d\) 可能生成相同的连通块。

观察:\(d\) 相同时所有 \(x\) 的邻域,只要没染完整棵树,都是不同的。所以去掉染完全集的情况(答案 \(+1\))。

现在我们倾向于在最小的可能 \(d\) 处处理这个连通块的贡献。假设有这么一个 \((S,x,d)\),想一想它在什么时候会被其它 \(d'\) 更小的 \((x',d')\) 取到。

很明显的一点是,由于最长链所在子树肯定没有全黑,那么 \(x'\) 只可能在这棵最长子树里,否则往别的子树走的话,为了保持长儿子子树染黑点集不变,肯定要让 \(d'\) 增加才行。

那么考虑如果 \(x'\)\(x\) 的长儿子,只有 \(d'=d-1\) 时才能让长儿子树内被染黑的点集不变。这时如果其它子树被染黑的点集不变,只可能是:在 \((x,d)\) 中它们完全被染黑,而走到 \((x',d-1)\) 时它们还是全部被染黑。这里可以看出算重的情况全部源自,由于子树深度不够,导致多个足够大的 \(d\) 将其完全染黑。

所以 \((x,d)\) 已最小化的条件就是:\(d\le \min(h_{x}-1,h'_x+1)\)\(h'_x\) 是次长链。于是可以获得部分分。

那么如果有些点不是关键点的话,每个连通块的最小 \(d\) 可能取不到(对应的那个点不是关键点)。但是把它放到能取到的点又非常难以考虑,\((x,d)\) 就不唯一了。

换一种思路:还是把每个连通块放到它的最小表示 \((x,d)\) 上去看。我们去判断这样的 \((x,d)\) 是否可以被某个关键点 \(x'\)\((x',d')\) 等效生成。\(d\) 的最小化限制仍然生效。

如果 \(x'\) 不在长子树里,那么条件是它所在的子树一定要被完全染黑。因为长子树里一定存在一个深度为 \(d\) 的点被染黑,所以 \(d'\) 一定要能从 \(x'\) 一路染到长子树里的深度 \(d\),那就一定会导致它自己的子树也全被染黑。而反过来,容易理解,如果 \(x'\) 子树被完全染黑,那一定存在能生成出 \((x,d)\)\((x',d')\)

如果 \(x'\) 在长子树里,首先它能染出一个 \(x\) 上的 \(d\) 级邻域就非常困难。而且就算染出来了,容易发现它也不是最小的 \(d\)。所以不用管。

于是影响只是每个点多了一个下界。

6.5,*3404 图论 AGC009D Uninity

看起来像是某种构造点分树,每个点处的 \(k\) 相当于某种点分树深度。于是首先果断得出答案最多 \(O(\log n)\) 级别。

然后希望找到一种刻画合法 \(k_i\) 的方式。

感受一下。有:相等的两个 \(k_i,k_j\),原树中 \(i,j\) 的路径上,一定要有 \(k\) 比它们更大的点。

考虑自底向上构造。在子树里从下到上,每次给根选一个最小的不会和子树里冲突的 \(k_i\)。可以用一个 mask 维护。

感性上,子树里突然炸出一个大的 \(k_i\) 显然没有把它换成小 \(k_i\) 更优。

严谨证明大概就是要证,贪心地最小化每个点当前限制的 bitmask 是最优的。

证明思路大概就是去说明一个点的 bitmask 对它的儿子 bitmask 大小有单调性。

(#)7.5,*3428 DP AGC009E Eternal Average

\(N\)\(0\)\(M\)\(1\)。你要不断删除 \(K\) 个数并加入它们的平均数直到无法操作,求最后得到的数有多少种可能。\(N,M\le 2000\)\(K-1\mid N+M-1\)

考虑建树。树的非叶节点数确定。然后根据贡献式,两种树的答案不同仅当有一层的 \(1\) 数量不同。尝试刻画。答案只和 \(1\) 在每一层的分布数量有关。

也就是每个叶子的贡献为 \([这个叶子是 1]K^{-dep_i}\)

  • 第一篇题解:

可以证明一种方案合法的条件为,\(1\) 部分的 \(\sum K^{-dep_i}\)\(0\) 部分的 \(\sum K^{-dep_i}\) 之和恰好为 \(1\)。(考虑每次合并 \(dep_i\) 最大的 \(K\) 个数,合不了不可能是 \(1\)

也就是问题等价于,我们想知道有多少个数 \(k\) 满足,\(k\) 可以表示成 \(M\)\(\sum K^{-dep_i}\) 的形式,而 \(1-k\) 可以表示成 \(N\)\(\sum K^{-dep_i}\) 的形式。

考虑怎么判定前者。把 \(k\) 写成 \(K\) 进制小数,则相当于我们可以(在忽略进位的情况下)把 \(k\) 某一位的一个 \(1\) 变成下一位的 \(K\),然后要求数字和为 \(M\)。也就是,\(M\ge ppc_K(k)\)\(M\equiv ppc_K(k)\pmod {K-1}\)

而后者是 \(N\ge ppc_K(1-k)\)\(N\equiv ppc_K(1-k)\pmod{K-1}\)。设 \(k\)\(len_k\) 位,则 \(ppc_K(1-k)=(len_k-1)(k-1)+k-ppc(k)\)

对小数点后 \(len_k\) 位 DP 即可。

  • 第二篇题解:

无法理解它的思路,但是看起来很牛。

5.5,*2795 博弈 AGC010D Decrementing

考虑当出现了一个 \(1\) 之后,双方肯定都只能 \(-1\),那必胜方就取决于 \(\sum (a_i-1)\) 的奇偶性了,也就是,偶数元素有奇数个时先手必胜。

\(\gcd\) 还不为 \(1\) 的时候,如果除去一个奇的 \(\gcd\)\(a_i-1\) 的奇偶性全都不会变化,所以这么做对改变必胜态没有任何用处。考虑偶的 \(\gcd\)。会在全部为偶数的时候出现。

考虑如果刚开始偶数元素就有奇数个的时候先手怎么办。每次可以挑一个偶数元素 \(-1\),后手肯定没法除以偶 \(\gcd\),并且后手做完偶数元素肯定是奇数个。

如果开局偶数元素有偶数个,那先手做完第一步不出意外就变成后手的必胜态了。

但是事情还有转机,如果先手第一步可以除掉一个偶 \(\gcd\),必胜态可能会变。不过也只是可能而已,因为每次除 \(\gcd\) 前还要做一次操作。不过除 \(\gcd\) 的次数显然很少,所以每次暴力判断是否还剩恰好一个非 \(1\) 奇数即可。

4.5,*3887 博弈图论 AGC010E Rearranging

成功更新了 AT 题自己想出的难度上限。不过好像确实不难。

限制的本质是,如果两个数不互质,那它们的相对顺序不可能改变。把限制的连线画出来,那问题就相当于,后手可以随意把没连线的元素换来换去,我们需要让换出的最大字典序尽量小。

考虑单个连通块的问题。我们肯定会把最小值 \(p\) 放前面。然后把最小值删去,剩下的每个连通块是独立的。但这时不能取每个连通块的最小值接上去,而是要选择和 \(p\) 连通的最小值,才能把别的更大元素卡到后面不影响 \(p\)

就完了。

3,*2355 图论 AGC011C Squared Graph

没对上电波啊这个题。被开局转化击败了。

\((a,b),(c,d)\) 在同一个连通块的条件是,\(a\to c\)\(b\to d\) 存在长度相同的路径。然后长度相同可以削弱成奇偶性相同。

然后就相对平凡了。分有奇环没奇环的图考虑即可。

5,*3315 图论 AGC011E Increasing Numbers

数位单调不降的数一定可以拆成若干个 \(111\cdots1\) 的和。这是 \(\frac{10^k-1}{9}\)。然后假设最少可以拆成 \(m\)\(\frac{10^k-1}{9}\),答案就为 \(\lceil\frac{m}{9}\rceil\)

这里有参考意义的是 \(111\cdots 1\) 的表示和拆开单调序列的方法。

然后考虑 \(\sum\limits_{i=1}^m\frac{10^{k_i}-1}{9}=n\implies\sum 10^{k_i}=9n+m\)。那就是右边这东西在十进制下的 ppc 不超过 \(m\)

直接模拟高精加 \(1\) 维护 ppc 即可,复杂度均摊正确。

6,*3863 DP AGC011F Train Service

一些基础观察:有解则一定存在所有列车在下行过程中不停留的解。存在 \(2A_i>K\) 即无解。否则一定有解。

于是我们只考虑上行时怎么避开来的列车。

只考虑模 \(K\) 意义下的时间轴。下行时车会占用模 \(K\) 意义下的一段区间,上行的车不能在这段时间里开。

那就是,在上行时,每一段出发的时间都被限制在了一个模意义下区间内。我们希望最小化停留的时间。

问题就在于你最后一段开始的时间是可以任选的。所以需要 DP。

\(dp_{i,j}\) 表示最后 \(i\) 段跑完之后停在了 \(j\) 位置,的最小停留时间。转移形如,把所有不在限制区间里的 \(dp\) 值全部拍到 \(l_i\) 上。随便拿个数据结构维护即可。方便的话可能要把平面拉伸一下,需要稍推一些式子。

4.5,*3490 DP AGC012E Camel and Oases

想得最久的居然是 DP 设计。/tuu

不管怎么走 \(v\)\(i\) 次跳跃后的值都是固定的。并且跳跃次数为 \(O(\log V)\),所以相当于一个分层的结构,每层有若干段可以通过走路抵达内部所有位置的区间,两层之间的区间只有嵌套关系。我们要做的是从每一层里拿一个区间出来,第一层拿的区间固定。要求这 \(\log V\) 个区间能覆盖 \([1,n]\)

显然第一层的区间数大于层数就无解了。所以要求解的段也就是 \(O(\log V)\) 级别。

对前后缀分别 DP:\(dp_S\) 表示已选定 \(S\) 中层的区间,覆盖的 \([1,n]\) 前/后缀长度最大是多少。查询时把前后缀互为补集的 \(dp_S\) 值拼起来。可做到 \(O(n\log V)\)

(#)9.5,*???? DP AGC012F Prefix Median

有一个长度和值域都为 \(2n-1\) 的序列 \(a\)。你可以任意排列 \(a\),然后生成长度为 \(n\) 的序列 \(b\)\(b_i\)\(a_{1\sim 2i-1}\) 的中位数。求可能的 \(b\) 数量。\(n\le 50\)

处理中位数问题的新鲜思路。

首先把 \(a\) 给排序了,看成每次选两个 \(a_i\) 加进去。有 \(b_i\in a_{[i,2n-i]}\)。然后……?

加数也太难搞了。但是 \(b_n\) 其实才是这里限制最严的数,考虑倒过来删 \(a_i\)\(b_n\) 初始一定为 \(n\)\(b_i\) 对应的 \(a_j\) 在每次删两个 \(a_x,a_y\) 过程中变化一定形如,\(j\) 朝着 \(a\) 这次删得少的一侧移动了最多一位。

那就显然不会有,\(i<j\),且一个 \(b_i\) 值在 \(b_j,b_{j+1}\) 中间。因为这样 \(j+1\to j\) 那里就移动了两位。\(b_i\) 能取的 \(a_j\) 一定是越来越稀疏的。

下证它和 \(b_i\in a_{[i,2n-i]}\) 合起来是充要条件。

假设 \(a\)\(1\sim 2n-1\) 的排列。考虑归纳证明,\(n=i\) 时符合条件的 \(b\) 均可以通过删掉两个 \(a_i\) 并重标号变成 \(n=i-1\) 的情况。

\(n=i\) 时一定有 \(b_i=i\)\(b_{i-1}\in \{i-1,i,i+1\}\)

  • \(b_{i-1}=i-1\):在 \(i\to i-1\) 这一步删去 \(i\sim 2i-1\) 中,没有在 \(b_{[1,i-1]}\) 中出现的,最靠近 \(i\) 的两个值。显然一定可以找到。
  • \(b_{i-1}=i+1\):同理。
  • \(b_{i-1}=i\):在 \(1\sim i-1\)\(i+1\sim 2n-1\) 分别删去一个最靠近 \(i\) 的值。

然后就可以 DP 了。把 \(a_i\) 排序,相当于从后往前,每次决定往左、右走还是不动。每次走会删除两个位置中间所有的位置,它们之后再也不能作为 \(b_i\) 被选中。注意相同元素的处理,令其中只有一个是能选的。

(#)6,*3089 计数 AGC013D Piling up

条件看起来挺奇怪的。但是由于是对操作序列计数,那就可以理解成,我们开局刚好有能恰好支持我们完成操作的黑白球数。

对白球考虑。\(dp_{i,j}\) 随便转移。然后根据定义要只保留 \(j\) 取到过 \(0\) 的操作序列,同时限制 \(j\) 全程不超过 \(n\)(不然黑球爆了)。

(#)7,*3905 贪心 AGC013F Two Faced Cards

给定 \(n-1\) 个二元组 \((a_i,b_i)\)\(c_{[1,n]}\)\(q\) 次独立询问,每次加入 \((a_n,b_n)=(d_i,e_i)\),然后你需要取 \(x_i\in\{a_i,b_i\}\),然后将 \(x_i\)\(c_i\) 两两匹配使得 \(x_i\le c_j\)。求合法情况下取到 \(a_i\) 的最大数量或报告无解。\(n,q\le 10^5\)\(V\le 10^9\)

如果选定了 \(x_i\),那肯定是 \(x,c\) 分别递增匹配,但这个刻画很不好做。

感受一下 Hall 定理会想到另一种刻画:有 \(f_i\),每个 \(i\in[x,n]\) \(+1\),每个 \(i\in[c,n]\) \(-1\),保证每个 \(f_i\)\(\ge 0\)。然后先把每个 \(a_i\) 都选上,要调整成 \(b_i\)\([b_i,a_i)\) \(+1\)。这里的贪心比较显然。于是获得了一个相对好推广的做法。

先把 \(c_i\)\(n\) 之前的 \(x_i\) 区间加计在 \(f\) 上,这些对于所有询问都相同。每次只会再加上一个 \([d_i/e_i,n]\),假设选 \(d_i\)

然后这时情况就等价于,限制 \([1,d_i-1]\)\(f_i\ge 0\)\([d_i,n]\)\(f_i\ge -1\)。那么可以先从后往前把所有 \(f_i\) 加到 \(-1\),然后从前往后对于前缀加到 \(0\)。这样信息就可以预处理出来了。

(#)10,*4201 adhoc AGC014F Strange Sorting

给定排列,每次将所有前缀最大值提到排列最后方。求排列排好序的轮数。\(n\le 2\times 10^5\)

佩服出题人和场上过的那位神仙。这题一个个结论全都反直觉得要命,一眼看去全是错的,能想到真的太离谱了。

场切那个哥们怎么是用平衡树杀过去的。

尝试入手。\(1\) 这个东西好像没有什么话语权。启示我们从大到小考虑。

假设 \(i+1\sim n\) 按顺序塞在某段子序列里了,那么它们之后肯定一直会按顺序作为某个子序列。我们希望判断 \(i\) 是否还需要额外的一次操作排好。

设排好 \(i\sim n\) 的次数为 \(f_i\)。从 \(f_{i+1}\) 转移到 \(f_i\) 需要做的是,判断 \(i\) 是不是 \(f_{i+1}\) 次操作的时候已经归位了,如果没归位再来一次操作即可。考虑设进行了 \(f_{i+1}-1\) 次操作时,\(i+1\sim n\) 中最靠前的数是 \(g_{i+1}\)

如果有 \(f_{i+1}=0\) 可以直接判断。否则 \(f_{i+1}>0\),就一定有 \(g_{i+1}\neq i+1\)。因为它操作一下就直接飞后面去了,如果 \(g_{i+1}=i+1\) 就肯定不会下一轮直接排好序。

那么只需看这个时候,\(g_{i+1},i,i+1\) 这三个数此时是否刚好顺序从左到右,即可判断是否需要多来一次操作。只有这种情况能让 \(i\) 被一起归位。

然后给出一个结论。\(g_{i+1},i,i+1\) 这三个数(不一定是按上面排的),它们三个的顺序一定在前 \(f_{i+1}-1\) 次操作中都保持循环同构状态。

一个引理:\(g_{i}\) 作为前缀 max 仅当它在 \(i\sim n\) 所有数的开头。

假设它是一个不在开头的前缀 max。操作完之后它就会贴到前一个前缀 max 后面。考虑下一轮操作。

  • 它们还是贴在一起。继续。
  • 它们被分开。那这轮操作时一定是,贴前面的那个数不是前缀 max,但 \(g_{i+1}\) 是。那这又和假设的 \(g_i\) 为不在开头的前缀 max 的情况一样了。
  • 根据 \(g\) 的定义,不可能一直这样转化下去。
  • 考虑某次操作前的状态。
  • 如果 \(g_{i+1}\)\(i\sim n\) 的第一个,另外两个数一定都不是前缀 max。
  • 如果 \(i+1\)\(i\sim n\) 的第一个,\(i\) 一定不是前缀 max。由引理 \(g_{i+1}\) 也一定不是前缀 max。
  • 如果 \(i\)\(i\sim n\) 的第一个:
    • 如果 \(g_{i+1}\)\(i\sim n\) 的第二个,那么 \(g_{i+1}\) 是前缀 max 而 \(i+1\) 不是。
    • 如果 \(i+1\)\(i\sim n\) 的第二个,那么 \(i+1\) 是前缀 max 而由引理 \(g_{i+1}\) 不是。
    • 否则 \(g_{i+1},i+1\) 都不是前缀 max。
  • 否则没一个是前缀 max。
  • 以上所有情况操作之后都符合循环同构。

于是只要知道 \(g\) 是啥,看一下初始状态就知道怎么回事了。\(g\) 容易递推。

2,*3571 DP AGC015E Mr.Aoki Incubator

首先分析选一个人能覆盖到什么人。它肯定会覆盖到右边比它慢的,左边比它快的。但是右边比它慢的还可以顺带覆盖到左边没“它”快但有它快的,左边比它快的同理。

所以实际上判定是,\(x\) 这个位置可以覆盖到,左边速度大于 \(x\) 右侧最小值的,和右边速度小于 \(x\) 左侧最大值的。

然后就可以 DP 了。\(dp_i\) 表示考虑前 \(i\) 位,第 \(i\) 位被覆盖的合法方案数。每次 \(j\to i\) 转移要求 \([j+1,i-1]\) 内,没有任何点在 \([lmax_j,rmin_i]\) 间。

\(lmax,rmin\) 都是单调递增的。那每次合法的 \(j\) 也一定是一段后缀。维护这个后缀即可。

inf,*4083 数学 AGC015F Kenus the Ancient Greek

\(q\) 次询问 \(n,m\),求 \(1\le x\le n\)\(1\le y\le m\)\((x,y)\) 中,进行辗转相除的递归层数(不计算仅交换两维的递归层)\(F(x,y)\) 的最大值,以及取到最大值的对数。\(q\le 3\times 10^5\)\(n,m\le 10^{18}\)

首先求 \(F(a,b)\) 最大值。令 \(a\le b\)。实际上,从 \((0,1)\) 开始一直辗转相乘,会一直得到斐波那契数列的相邻两项,而且这是最严格的构造,所以找到最后一个合法项即可。显然最大值是 \(\log\) 级别的。

这启示我们去先毙掉一些不可能成为最大值的方案。首先 \(\gcd\neq 1\) 原地去世,因为同时 \(/b\) 肯定还能再扩展一次。

这里可以直接爆搜。根据前面策略,起点一定是 \((0,1)\),加入一些无前途剪枝和最后一步直接算优化,直接过了。据说状态数看起来像 \(\log\),有待考究。

还有一个复杂度确定的做法。还是只考虑 \(\gcd=1\) 的。尝试用一些代表对去指代所有辗转相除一轮后相等的对。即,代表对 \((i,j)\) 满足 \(i<j\le 2i\),指代了所有 \((i,j+ki)\)

再杀一些不是最大值的情况。和上面毙掉 \(\gcd=1\) 同理,如果有一个 \(F=k\)\((a,b)\) 满足另一个 \(F=k\)\((c,d)\)\(b\ge c+d\),那在同样的 \((n,m)\) 下,\((a,b)\) 辗转相乘扩展出来的所有状态,肯定全都会比 \((c,d)\) 的最优扩展方案劣,所以压根就不用考虑 \((a,b)\)

实际上这个时候打表可得,这时每组 \(F=k\) 的代表对数恰好只有 \(k\) 个。它们来自前一组 \((x,y)\)\((y,x+y)\),以及一个突然冒出来的 \((fib_{k+2},fib_k+fib_{k+2})\)(斐波那契数)。它来自前一组的一个非代表对。

前者是好理解的。后者会出现是因为打表后你可以发现,它是唯一一个,能成为代表对,并且不会因为大小限制被杀掉的扩展情况。

我是不知道这东西要怎么直接想或者手玩出来。

5.5,*3026 AGC016E Poor Turkeys

正着做比较奇怪,我试了一下直接思考,可以判一个点能不能保留,但是同一块里的两个点能不能同时保留就不太好想清楚了。

倒着做。有这么一种方式判断 \((x,y)\) 是否合法:先选中 \(x,y\),从后往前遍历所有人,如果两只鸡有一方被选中就把另一个也选中,表示,这只鸡必须进我的肚子,谁也别抢,不然 \(x,y\) 肯定没法全活下来。如果一个人的两只鸡都被选中他就没得吃了。

跑过去了。

素质略差。注意上面的过程,实际上因为 \(x,y\) 的被选中信息可以拼起来(没被选中的点只要有解就是随便选的),直接对每个点单独做这个过程即可。最后判断有没有交就用 bitset。

4.5,*3754 博弈 AGC016F XOR Replace

即两个棋子的 SG 状态异或起来。那就计算 \(SG_1=SG_2\) 的情况即可。\(n\) 极小,考虑直接状压。

SG 值可以看作是给这个 DAG 做了一个分层操作。一种分层方案合法,要求每一层的点都必须往它下面的所有层连至少一条边。每层内部没有边,往上连无限制。

每次剥掉 \(SG_i=0\) 的点即可。

被骗了,早知道开一下这个题了。DAG 计数的 trick 现在真是烂大街了啊。/ll

4,*3156 AGC017C Snuke and Spells

你需要找到最优秀的一种刻画方式以解决本题。

我想的是:设目前 \(=i\) 的球有 \(b_i\) 个,最终若有 \(c_i\) 个,那么限制相当于每个 \(c_i\) 都要求 \([i-c_i+1,i]\)\(c_i\) 全部为 \(0\),求 \(\min\limits_{c} \sum |b_i-c_i|\)。这个单次可以线段树优化做到 \(O(n\log n)\),但多次修改就狗带了。

优秀刻画:不从最终状态考虑。设每个 \(b_i\) 能在 \([i,i-b_i+1]\) 上覆盖某种标记,那么 \([1,n]\) 里没被覆盖过的位置数即为答案。这就老好做了。

感觉两种思路就是,框一个合法状态让目前状态匹配过去,和想办法把目前状态调整成一个合法状态,的区别吧。只能说各有各的发挥之处。

5.5,*3158 图论 AGC017E Jigsaw

考虑把每个拼图的左右分成接地和不接地两类。那么一个交接处有三种可能:左上右下、左下右上、左下右下。且两端都必须是下。前两种可能要求高度正好对上。

如果不考虑两端和第三种情况,那么可以把每个积木看成连接两点的边,两点为需要匹配的高度值(根据左右分成两种)。判断有没有欧拉路径即可。

如果考虑完全情况,左下右下的可能相当于我们可以自由添加从第一种连往第二种的边;两端要求都是下的情况相当于每个弱连通块都必须要添加至少一条第一种连往第二种的边。然后要把图补成欧拉回路。

于是可以写出有解的充要条件:

  • 第一种点全部入度 \(\ge\) 出度。
  • 第二种点全部出度 \(\ge\) 入度。
  • 每个弱连通块中至少有一个点出度 \(\neq\) 入度。

(#)6.5,*3953 组合 AGC018E Sightseeing Plan

有点阴间了。首先答案是一个形如这样的东西:

\[\sum\limits_{X_1\le x_1\le X_2}\sum\limits_{Y_1\le y_1\le Y_2}\sum\limits_{X_3\le x_2\le X_4}\sum\limits_{Y_3\le y_2\le Y_4}\sum\limits_{X_5\le x_3\le X_6}\sum\limits_{Y_5\le y_3\le Y_6}\binom{x_2-x_1+y_2-y_1}{x_2-x_1}\binom{x_3-x_2+y_3-y_2}{x_3-x_2} \]

两项都跟 \(2\) 有关,考虑把它定住,处理 \(1,3\)。现在考虑 \(3\) 的部分:

\[\begin{aligned} &\sum\limits_{X_5\le x_3\le X_6}\sum\limits_{Y_5\le y_3\le Y_6}\binom{x_3-x_2+y_3-y_2}{x_3-x_2}\\ =&\sum\limits_{X_5\le x_3\le X_6}\binom{x_3-x_2+Y_6+1-y_2}{x_3-x_2+1}-\binom{x_3-x_2+Y_5-y_2}{x_3-x_2+1}\\ =&\binom{X_6+Y_6-x_2-y_2+2}{X_6-x_2+1}-\binom{X_5+Y_6-x_2-y_2+1}{X_5-x_2}\\&-\binom{X_6+Y_5-x_2-y_2+1}{X_6-x_2+1}+\binom{X_5+Y_5-x_2-y_2}{X_5-x_2} \end{aligned}\]

就是两次上指标求和。同理得 \(1\) 部分是:

\[\binom{x_1+y_1-X_2-Y_2+2}{x_1-X_2+1}-\binom{x_1+y_1-X_1-Y_2+1}{x_1-X_1}\\-\binom{x_1+y_1-X_2-Y_1+1}{x_1-X_2+1}+\binom{x_1+y_1-X_1-Y_1}{x_1-X_1} \]

现在压力给到怎么对每一对 \(x_2,y_2\) 算这一坨。相当于现在要计算 \(16\) 个类似 \(\sum\limits_{X_3\le x\le X_4}\sum\limits_{Y_3\le y\le Y_4} \binom{x+y-A-B}{x-A}\binom{C+D-x-y}{C-x}\) 的东西。

联想到了 AGC001E。考虑组合意义,这是 \((A,B)\to (C,D)\) 的所有路径中,在矩形 \((X_3,Y_3)-(X_4,Y_4)\) 内部分的点数之和。

把每条路径的点数用曼哈顿距离表示出来,拆到矩形的入点和出点上。那对于每个入点、出点计算它贡献了多少次即可。

(#)8,*3793 图论 AGC018F Two Trees

很厉害诶。

首先杀掉存在点在两棵树中度数奇偶性不同的情况。

然后还不太好做,但你感受一下发现这个限制其实没有那么强,因为很多取正取负的东西都可以做文章。考虑加强限制,令所有 \(|X_i|\le 1\)。尝试在这样的情形下构造出一组解。那么有奇数个儿子的 \(X_i\)\(=0\),否则为 \(-1/1\)

注意是奇偶性相关,以及某些 \(\le 1\) 的限制,考虑如下构造:把两棵树的根连到另一个点上。对于所有成对的奇度点(偶儿子点),把两棵树的对应点连接。跑欧拉回路。那么成对的点取 \(-1/1\) 取决于这条横叉边的方向。

考虑回路在某个奇度点的子树里进出了多少次。一次是从父亲进/出,剩下的就是从横叉边出去/回来了。横叉边的进出次数差是没有办法超过 \(1\) 的,不然一条父亲边肯定成不了回路。所以利用这个性质可以符合条件。

7,*3597 计数DP/GF AGC019E Shuffle and Swap

有个比较神奇的转化:\(a,b\) 分别随机排列 \(\implies\) \(a,b\) 先随机配对,再随机排序。考虑对于一个配对方案计算有多少种排序方案合法。

把配对的 \(a_i,b_j\) 位置在 \(A\) 上连一条有向边得到一张图。显然没有点的度数超过 \(2\),那么图只能是链环集合。孤立点算自环。

环里面肯定全是 \(1\),咋操作都行。考虑链。这些位置按顺序在 \(A\) 里肯定是 \(11\cdots10\)\(B\)\(011\cdots1\),唯一的方案就是从后往前依次操作每条边。

链的数量是固定的,它为 \(A_i,B_i\) 不同的对数 \(/2\),入点出点已经固定。设链数为 \(w\)。现在不知道的就是链之间怎么连接以及有哪些环。

  • EGF 做法:

容易得出链和环的 EGF \(\sum \frac{z^i}{(i+1)!}\)\(\sum\limits_{i=1} \frac{z^i}{i}\)。改写一下变成 \(\frac{e^z-1}{z}\)\(-\ln(1-z)\)

答案 EGF 即为 \((\frac{e^z-1}{z})^w\cdot \exp(-\ln(1-z))=\frac{1}{1-z}(\frac{e^z-1}{z})^w\)。(链有序环无序)

答案即为 \(w!(k-w)!k![z^{k-w}]\frac{1}{1-z}(\frac{e^z-1}{z})^w\)

  • DP 做法:

考虑到 \(n\le 10^4\) 除了给大常数 NTT 还可能是给小常数 \(O(n^2)\) 的,可以直接做这个 DP。

先 DP 链的方案数,然后和环拼起来即可。

8,*3742 计数 AGC019F Yes or No

很显然的回答策略:Yes 多回 Yes,No 多回 No。盗取小粉兔的图。

从右上角往左下角走,横坐标 Yes 往左,纵坐标 No 往下。把一轮问题的折线拍到上面,问对的次数就是上面的红线段数。

所以问题就是对所有折线求上面的红色线段数之和。数据范围有点吓人。不妨设 \(N\le M\)

有这么一个事实:如果没有图上那条斜线旁边的折线,怎么走出来都是 \(N\) 条。因为你每一次跨过这条斜线都可以看作是整条路线按这条斜线翻转过来继续在斜线下面走。

所以只需要考察斜线左上方那 \(M\) 条横红线段的贡献即可。这个好算。

6.5,*???? 概率DP AGC020F Arcs on a Circle

魔怔。

首先断环为链就把起点定在最长的段前面。这样就不会出现某一个段从尾段绕回来覆盖的情况。

如果坐标都是整数,那一切都很好解决。朴素 DP 一下即可。但现在这个连续坐标情况非常抽象。

不过链长倒是整数,考虑更具体一点。一条从 \(A\) 开始长度为 \(l\) 的弧能覆盖到 \(B\) 的条件是,\(\lfloor B\rfloor-\lfloor A\rfloor <l\),或者 \(\lfloor B\rfloor-\lfloor A\rfloor=l\)\(\{B\}< \{A\}\)。诶,这样就只跟整数和小数部分的相对大小有关系了。所以可以开局枚举 \(l\) 条弧起始位置的小数部分相对顺序,然后再做这个 DP。\(O(n!2^n(nc)^2)\)

3.5,*2886 构造 AGC021C Tiling

玩一下可以发现,如果 \(n,m\) 都是偶数,那么我们一定会倾向于把网格划分为 \(2\times 2\) 的小正方形,然后填相同的两个块。

如果不是偶数,那可能会多出一行,或者多出一列。显然只能把对应的东西排进去。

直觉告诉我们有一些非常魔怔的情况。比如 \(n=m=3\) 时,排成螺旋丸状可以塞下横竖各两个块。这是前面的方法都做不到的。

但实际上前面的方法也只不能解决某一种块中多了一个,导致需要单独占一个正方形,于是空间被浪费放不下的情况。你发现 \(n=m=3\) 的螺旋丸排法好像刚好可以解决这个问题。而且恰好在 \(n,m\) 都为奇数的时候解决。

于是在 \(n,m\) 为奇数的时候在某个角落放个螺旋丸就可以解决一些问题了。

(#)8,*3944 计数 AGC021E Ball Eat Chameleons

\(n\) 只初始为蓝色的变色龙,你给它们依次扔了 \(K\) 个蓝球或红球,每次会有任意一只变色龙把它吃掉。如果一只某色的龙,在某个时刻之后,它吃过的和它本身异色的球数严格大于同色球数,它就会变色。求有多少种扔球方案,使得最后可能所有变色龙都是红的。\(n\le 5\times 10^5\)

必须要从答案序列的角度刻画。考虑怎么判定一个答案序列是否存在分配给 \(n\) 只变色龙的方案。

如果一只变色龙最后变成了红色,那么条件可以刻画为:它吃的红球比蓝球多;或者两色球一样多,最后一个吃的是蓝的。

设红色球有 \(a\) 个,蓝色球有 \(b\) 个。如果 \(a-b\ge n\) 显然就起飞了。如果 \(a-b<0\) 显然就狗带了。否则,一定会有一些变色龙是两色相等的,还有一些要求红色比蓝色多。称前者为 B 类,后者为 A 类。

首先如果一条 A 类变色龙吃到的红色比蓝色多大于 \(1\) 个,显然没有什么含义。把多的红色分给某个不满足条件的 B 类不香吗?所以最优策略:A 类变色龙满足红色数恰好为蓝色数 +1,有 \(a-b\) 个。B 类有 \(n-(a-b)\) 个。

然后 B 类吃了 \(>2\) 个球显然也没有什么含义。从里面拿一对不在最后的 AB 出来给有需要的 B 类不香吗?所以 B 类最优情况下吃的一定是 AB。剩下没被 B 类吃的东西,可以丢给 A 类且保持它们的条件仍然满足。但有个例外:\(a-b=0\),也就是没有 A 类。这个之后再讨论。

那么 \(a-b\neq 0\) 时,一个答案序列合法仅当可以拿出 \(n\) 个子序列 AB。头脑风暴一下可以转化为不存在任何一个前缀的 B 数减 A\(>b-n\)。直接反射容斥即可。

\(a-b=0\) 时,问题在于剩下没被 B 类用的数没法丢给 A 类解决。一个巧妙的思路是因为显然序列最后一个肯定是 B,把那个 B 拿掉,变成 \((a,b-1)\) 的情况,钦定吃了这个 B 的数的是那个 A 类的变色龙。然后就变成了前面的情况。

5.5,*4103 计数DPNTT AGC021F Trinity

瓶颈是答案对应多个网格。尝试对每个答案找一个具有代表性的网格计数。

如果一个黑格上下左都有别的黑格,那直接把它换成白的并不会影响答案序列。实际上,如果只对不存在这样的黑格的网格计数,就可以和答案构成双射了。

然后这个东西看起来已经挺能做的了。寻找一个优秀的计数顺序。三种方向好像都不太行,考虑从右往左,每次放置一列黑格之后,不在两端的黑格就限制了它们所在的行以后再也不能放东西,也就相当于把这些行删去了。

所以有 DP:\(dp_{i,j}\) 表示第 \(i\) 列后全部做完,还剩 \(j\) 行没有删。\(dp_{i,j}\binom{j}{k}\to dp_{i-1,j-max(k-2,0)}\)

组合数卷积,可以 NTT。

6,*3800? adhoc AGC022D Shopping

先做一些基本的把 \(t_i\) 模掉 \(2T\) 的操作。

最无脑的方案就是按顺序每个点等 \(2T\)

然后把点分为四类:车从左/右来时到,能不能在车第一次折返回来时上去。(左能,右能) 记为 \((0/1,0/1)\)。我们希望做一种配对操作,使得不同点对应的周期有一半能重合在一起使答案减一个周期。

\((0,0)\) 或者 \(t_i=0\) 的点直接丢了。

\((x,1)\) 点后面有 \((1,y)\) 点时,可以修正一下顺序:走完 \((1,y)\) 再紧接着走 \((x,1)\),这样这两部分可以少一个周期。

但是 \((0,1)\) 点后面不会有 \((1,0)\) 点。所以以上的匹配只会发生在 \((1,1)\) 和它们两个中间。

所以先拿 \((1,1)\)\((1,0),(0,1)\) 优先配对,剩下 \((1,1)\) 两两配起来即可。

注意这些匹配和 \(n\) 这位是没关系的,因为上面这些操作能少一个周期建立在后面那位之后还要接个东西的前提下。所以单独特判 \(n\)\((1,x)\) 时要把最后这位直接砍了。

(#)9.5,*3606 DP AGC022F Checkers

\(X = 10^{100}\)。数轴上有 \(N\) 个棋子,第 \(i\) 个棋子位于坐标 \(X^i\)。每次操作可以选择两个棋子 \(A,B\),将 \(A\) 移动到关于 \(B\) 对称的位置,并删除 \(B\)。同一位置可以有多个棋子。\(N-1\) 次操作后,求剩下的那个棋子位置的可能数量。\(1 \leq N \leq 50\)

太抽象了……

首先,这个两个元素操作然后去掉一个的限制,不知道为什么地让我们联想起了建树,所以 \(A\) 关于 \(B\) 对称可以看成 \(B\)\(A\) 连了边。尝试对这棵树考虑。

对称的式子是 \(A\gets 2B-A\),可以发现答案形如 \(\sum\limits_{i=1}^n 2^j(-1)^k x^i\),即操作过的每一个点都会给答案贡献一项。提一嘴,因为 \(x\) 是个超级巨大的数,我们可以假定,只要两个点的坐标表示成上面那个形式后有 \(x^i\) 的系数不一样,它们就绝对不在同一个位置。所以就是计数 \((j_i,k_i)\)

对于一棵固定的树,它的答案求解形如,从下往上操作,每次 \(fa_x\to x\),表示数轴上把 \(fa_x\) 关于 \(x\) 对称,那么会导致 \(x\) 子树里所有点的贡献 \(\times 2\)\(fa_x\) 之前操作过的所有子树以及 \(fa_x\) 本身贡献 \(\times (-1)\)

容易发现每个 \(x_i\) 的贡献中,\(2^j\) 的部分就是 \(2^{dep_i}\)。而 \((-1)^k\) 部分看起来就不那么好处理了,和 \(x_i\) 为祖先中第几个儿子相关。

反过来考虑。我们显然只关心这个“取反”操作次数的奇偶性。如果我们已知 \(x_i\) 被取反次数的奇偶性,那么它的儿子中,(不考虑儿子又有奇数个儿子导致的自发取反)取反次数奇偶性和 \(x_i\) 不同的个数,就恰好为 \(\lceil\frac{cson_x}{2}\rceil\)。如果从上到下 DP,那我们就不太需要关心这些子树的具体顺序,反正只要不同的子树刚好是那么多,就有办法调整。

现在可以对树做个 DP 了。设 \(dp_{d,i,c,j}\) 表示现在前 \(d\) 层填好了 \(i\) 个点,第 \(d\) 层有 \(c\) 个点,其中 \(j\) 个有奇数个儿子,当前的不同答案数。推的时候会发现 \(d,c\) 没有用,可以丢了。

枚举当前层有 \(k\) 个点,只要有那个 \(j\) 就可以算出,这些新点,在不考虑它们自己取反的情况下,有几个点跟父亲取反状态不同。即 \(\frac{j+k}{2}\)(奇偶性不对就爆了)。计数时任意选择哪些点不同。

如果考虑它们自己取反,就需要再枚举实际上有 \(l\) 个点的状态和父亲不同。那么至少要有 \(|l-\frac{j+k}{2}|\) 个新点的儿子个数为奇数,即至少要把这么多个相同/不同的点给取反。

理论上来说奇点个数可以是 \(|l-\frac{j+k}{2}|+2x\),因为如果同时取反了相同点和不同点,它们的效果会抵消。

但我们发现只用 \(|l-\frac{j+k}{2}|+2x\) 进行转移才是对的,否则会算重。因为更多的奇点数并不会导致这一层的贡献变化,而下一层点接到的父亲并不影响它们的分配,总之就是啥用没有。

所以 \(dp_{i+k,|l-\frac{j+k}{2}|}\gets dp_{i,j}\cdot\binom{n-i}{k}\binom{k}{l}\)\(O(n^4)\)。存在 \(O(n^5)\) 及以上的稍微简单一些的 DP。

启示大概是,方案数的计算有时可以通过考虑两两层之间的变化(而不是全局的状态)处理。

好像可以做到 \(O(n^3)\),不是很懂。

7,*3173 博弈 AGC023D Go Home

首先为啥会有人不往自己家方向投票来着?观察样例,发现其中一个原因是,如果在往那个方向开的过程中有支持这个方向的人下车了,自己可能会打不过另一个方向的人,那反倒还绕远了。不如由着他们。

考虑一些其它的角度。比如倒过来看。

车开的过程形如,到过的楼为一段区间,它会每次往左端点或者右端点扩张。那很明显最后一个到的不可能是除 \(1\)\(N\) 之外的任何楼。

如果某一时刻,车在所有没到过的楼的某一侧(而不在某两栋楼中间),那显然只会往那些楼的方向一路直接过去送完所有人。这种情况恰好发生在车初次到达 \(1\)\(N\) 的其中一个的时候。考虑遇到这种情况之前发生了什么。

如果某一时刻,车两边只剩下了 \(1\)\(N\),中间的全走过了,那么车肯定会先开往人数比较多的那一边。假设 \(1\) 的人不少于 \(N\)。这时 \(N\) 就没有决定权了。

进一步考虑 \(1,N\) 中间还有没走过的楼时的情况。依然假设 \(1\) 的人不少于 \(N\)

如果某一时刻,车第一次到达了 \(N-1\),需要决策是直接到 \(N\) 还是先往 \(1\) 的方向开。那么,\(1\) 那一侧的所有人都没有任何理由支持这辆车跑到 \(N\) 那边去,因为有 \(1\) 撑腰,往 \(1\) 这边开的过程中,他们人数一定一直都比 \(N\) 这里要多,不可能在某个时候 \(N\) 有办法把车叫回去。所以肯定会直接往 \(1\) 那一边开,直到送完 \(1\),跑回来送 \(N\)

如果某一时刻,车第一次到达了 \(2\),要是下一步直接到 \(1\),就进到了一路送完所有人的情况,\(N\) 还是最后一个到的;要是下一步先往 \(N\) 的方向开,那么迟早有一刻,会变成到达 \(N-1\) 的情况。

所以,在 \(P_1\ge P_N\) 的情况下,\(N\) 永远是最后一个到的!

所以 \(N\) 的人这个时候肯定摆了,既然自己肯定是最后一个到的,那还不如,赶紧让 \(1\) 先到,进那个一路送完所有人的情况,这样对自己是最有利的。所以他们肯定会一直跟着 \(1\) 的人投票。

所以,整个问题等价于 \(ans\gets ans+X_N-X_1\)\(P_1\gets P_1+P_N\)\(N\gets N-1\) 的情况。\(P_1<P_N\) 也是同理的。

直接递归判定下去。递归的终点显然在 \(S<X_1\) 或者 \(S>X_N\) 的时候。

其实这么看下来,注意力充分的话应该可以在分析完样例之后直接感受到结论。但还是这么列出来吧。

5,*3653 计数 AGC023E Inversions

\(a_i\) 排序,设 \(b_i\) 是排序后的 \(i\) 在原序列中的位置。那么排列的方案数就是 \(\prod (a_i-i+1)\)。设其为 \(tot\)

计逆序对数的话,肯定是要从每个逆序对的位置对答案的贡献来考虑。考虑排序后的 \(i<j\) 两个位置在原序列中形成的逆序对。

  • \(b_i<b_j\):那么有 \(p_i>p_j\)。所以等价于在 \(a_i\) 里多扣了一个位置。

形成逆序对的方案数是 \(\binom{a_i-i+1}{2}\cdot\prod_{k=i+1}^{j-1}\frac{a_k-k}{a_k-k+1}\cdot\frac{tot}{(a_i-i+1)(a_j-j+1)}\)

  • \(b_i>b_j\):有 \(p_i<p_j\)。逆序对非常难以计算,但是发现我们可以算顺序对。于是跟刚刚是一样的了。

快速计算的话,整理一下,写成一个二维偏序的形式,就差不多了。

4,*3148 贪心 AGC023F 01 on tree

很经典的题,简单写一写。

如果有 \(0\) 直接取显然不劣。那么考虑把 \(0\) 跟父亲的 \(1\) 合并起来。然后可以得到某个点有某种 \(0,1\) 个数的比值作为权值,按照权值去取就是最优的。

3.5,*2307 图论 AGC024D Isomorphism Freak

两棵树如果最大深度不同那就没法同构。所以下界是直径长度一半上取整。然后分析就简单了。

(#)5,*3001 DP AGC024E Sequence Growing Hard

每次在 \(A_{i-1}\) 里加一个元素得到 \(A_i\),并且加完之后,和加的位置相等的一段必须大于这一段右边的数。

显然乱加一定会算重,那不如……直接强制加到这一段的最右边。这样不仅不会算重,而且还使判定条件更加简洁了,即,它大于它右边的数。

\(a_i\) 从小到大 DP 决定它被加入的位置就能做了。

5,*3554 字符串DP AGC024F Simple Subsequence Problem

没有看上去的阴间……实际上可能的字符串的数量没有爆炸的多,也就是 \(2^N\) 的级别,而且长度普遍很小。考虑怎么做这个匹配过程。

想一想平常我们做子序列匹配会干什么。就是不断在文本串后面找到第一个和模式串一样的字符。那么匹配过程中只有模式串和文本串后面的部分是重要的。

而我们在 DP 诶。我们正在决定模式串是什么诶。然后就可以设计状态了。\(dp_{T,S}\) 表示已匹配上了 \(T\),文本串后面还有 \(S\),有多少个可能的文本串还符合条件。每次枚举模式串下一个接 \(0/1\)。实际上这个状态数可以接受,所以直接 DP 就做完了。

6.5,*2868 构造图论 AGC025D Choosing Points

我为啥做过这题来着。

首先考虑把距离为 \(\sqrt{D_1}\) 的点连起来。下证:这是张二分图。

  • 两个点被 \(D\) 连起来仅当 \(x,y\) 为横纵距离,\(x^2+y^2=D\)
  • \(D\) 写作 \(4^k\cdot d(4\nmid d)\)。容易发现只需验证 \(d\) 的合法性。考虑 \(d\)\(4\) 的余数。
  • \(3\):根据平方同余性质无解。
  • \(1\)\(x,y\) 一奇一偶,按 \(x+y\) 黑白染色。
  • \(2\)\(x,y\) 都是奇,按 \(x\) 黑白染色。

\(D_2\) 的也连出来。问能不能取出一个大小为原图 \(\frac{1}{4}\) 的在两个二分图里都是独立集的点集。考虑给所有点赋两个信息(在两张二分图里的颜色),根据鸽巢原理肯定有个颜色出现不小于 \(\frac{1}{4}\)

(#)5.5,*3584 图论构造 AGC025E Walking on a Tree

手玩有概率会玩出一种神秘的情况:所有路径形成了欧拉回路。发现这个时候每条被路径覆盖的边都可以被正反走同样的次数。所以一下就可以获得取答案上界的方案。

启发我们去把非欧拉回路的情况补成欧拉回路。具体来说,如果一条边 \((fa_u,u)\) 被覆盖了奇数次,那就创造一条路径 \(fa_u - u\)。对着这个东西跑欧拉回路即可获得方案。答案直接算取到上界的情况。

5?,*3900? adhoc AGC025F Addition and Andition

@Otomachi_Una_ 的题解提出了可以写一个动画程序观察变化性质。确实在这种元素变化结构简单的题目里很好用。

总之发现,如果 \((x,y)\) 初始时只有一对某位上的 \((1,1)\),那这一对会一直往高位跳,如果遇到 \((0,1)\) 或者 \((1,0)\)\(1\) 的那方就会跳过这一部分 \(1\) 连续段,并把连续段归零。

考虑多对 \((1,1)\) 怎么办。它们会同时跑动。如果尝试从高位到低位进行移动操作,你会发现它们不会互相跨过。所以从高到低操作每一对 \((1,1)\) 就可以做到 \(O(n^2)\)

怎么直接过了?

实际上把 \((0,0)\) 连续段缩起来复杂度就是线性的。考虑,每一个 \((0,1),(1,0)\) 都会导致 \(1\) 的个数变少,即可。

(#)6.5,*3106 DP AGC026E Synchronized Subsequence

有 ab 串,a 和 b 都恰有 \(n\) 个。让第 \(i\) 个 a 和第 \(i\) 个 b 成对。你需要选出若干对 ab 并按照原序列顺序排布,求得到的字典序最大串。\(n\le 3007\)

考虑这个题的字典序最大并没有什么很好的方法可以刻画,硬做吧。

从前往后做的话对字典序的影响有点不好处理。所以从后往前,\(dp_i\) 表示只看 \(i\) 及之后的对是否删除之后最大的字符串。考虑 \(dp_{j>i}\to dp_i\)

  • \(i\) 对及其中间形如 aabaabb
    • 这里其实有个性质需要注意到:头尾 a,b 中间的 a 全都属于 \(>i\) 的对,b 全部属于 \(<i\) 的对。
    • 那么让字典序最大显然需要把中间的 a 全部删掉,b 不用管,不属于此次决策。\(dp_i=(ab)+dp_j\)
  • 形如 bbabbaa
    • 中间的 a 全部属于 \(<i\) 的对,b 全部属于 \(>i\) 的对。
    • 那么我们希望把中间的 b 全部保留。这时保留会导致一些 \(>i\) 的对被加入决策,导致决策范围变大,又需要把变大的决策范围的 b 给加进去,然后继续变大……直到某一次扩大并没有 b 被加入为止。

\(O(N^2)\) 随便做。

难点感觉在想到这个状态设法。没在其它字典序相关题里见到过这种思路。

(#)7.5,*3704 博弈DP AGC026F Manju Game

here。

6,*2631 贪心 AGC027B Garbage Collector

如果某次我们出发需要捡某个集合的垃圾,那显然是到集合最右端再一个一个捡回来。

但是连续取好像,并不是最优秀的。因为快速取完那就会导致很多贡献堆在最后一段。

把单次贡献式子拆一下,大概是个取的垃圾从右到左系数逐渐递增的线性函数。感受一下,把所有垃圾平均划分给每次出发才是最优的,因为可以让更小和更大的系数分配更为平均一些。

然后枚举取的次数 DP 即可。

5.5,*2984 构造 AGC027D Modulo Matrix

因为只限制了相邻格子,考虑做个黑白染色,这样只需考虑异色间的限制。

先试试能不能让模出来的结果为 \(1\)。互不相同的话,从质因子的角度下手,只要质因子集合不同那就是不同的。刚好模结果为 \(1\) 很好解决,直接 \(+1\) 就是了,而且肯定还互质着,不必考虑别的问题。

这么一种构造思路:我们希望给黑格分配一个数,然后让白格取四周数的 lcm \(+1\)。现在主要的问题是让白格互不相同,也就是需要优秀地给黑格分配质因子。显然不能按行分配。

玩一下会感受到,我们让黑格每条斜线和反斜线分别乘上同一个质数,这是一个不错的解。然后要合理调整一下质数顺序把白格数字搞小一点。

(#)8,*3634 计数 AGC027E ABBreviate

这个题很经典了。考虑寻找一些操作中的不变量。如果 a 看作 \(1\)b 看作 \(2\),那么整个序列加起来模 \(3\) 的值是不变的。所以一个串如果被缩成一个字符,那也是唯一的。当然,如果是 \(0\) 就没法缩成一个字符。如果所有相邻字符都不同也不行,除此之外归纳一下发现都是可以的。

然后我们有一种思路:框一个目标字符串,把原串分段去尝试匹配上目标串。

首先目标串肯定权值和跟原串是一样的。然后如果让分段尽可能短,那么并不会出现 ababa.. 这样相邻字符全不同且段长不为 \(1\) 的情况,不需要判。最后匹配出来可能会剩一段权值加和为 \(0\) 的没配上。

好像可以直接多出来的这一段直接并到最后匹配上的段去!不过如果这里合上去,可能会导致最后一段变得不符合相邻不可全不同的条件。但我们可以调整分段,所以还不一定是无解的。

玩一下这个调整可以得到结论:如果分段成功并且原串里有相同的相邻两个字符,那就可以匹配上。(或者最开始两个串就一样)于是可以随便计数。

7.5,*3544 图论 AGC027F Grafting

重要题意:每个点最多被选一次。那就不存在类似汉诺塔一样的递归来回捣鼓操作了。

正常来说应该猜一下有一个点全程没有被操作过。那就枚举一个根之后做剩下的东西。

如果一个点初始没有接在正确的点上,那它就必须要在某个它是叶子的时刻一步到位。否则如果接在了正确的点上,那它就不能操作。所以,所有需要操作的点一定全部集中在树的上端。不会存在一个要操作的点下面接不操作的点的情况。现在只用考虑这些顶层点要怎么操作。

必须要等一个点的所有叶子都被丢掉才能进行操作,并且每次操作必须要接到已经不需要操作的点上,这是一个拓扑过程。于是就可以做了。

\(O(TN^2)\)。发现复杂度有点过于富裕,并且 WA 掉了。

事实上存在所有点都要操作的情况。具体详见官方题解。

不过你只要能意识到会有这种事情你就赢了,怎么构造出这样的情况倒是不太重要,毕竟复杂度才那么点。那就枚举第一步操作是什么,就转化为有不动点的情况了。\(O(TN^3)\)

5,*2463 贪心 AGC028C Min Cost Cycle

  • 限制和最优化方向相同:直接把限制丢了。

\(n\) 个点的有向完全图,每条边 \(u\to v\) 边权为 \(\min(a_u,b_v)\)。求最小权哈密顿回路。\(n\le 10^5\)

被击败了!并且被这个题骗了没去看 D。

我一直想的是把 \(b_i\to a_i\) 的图给画出来,然后先把 \(a_i\) 贡献都算上,接着套丁香之路/IOI2016 railroad 的欧拉回路 trick,但是实际写出来会发现一个很严重的问题,就是这题的最优化方向和那两题居然是反的:额外走边反而会导致答案更优。

那么此 trick 中对构造可以对应到原方案的证明就完全爆掉了。

这个时候正确的思路应该是,联想到当时做 railroad 的情景,是一直在找方案性质然后什么都找不出来。那反过来的话,这题不就应该有点什么性质了吗?

由于每个 \(a_i,b_i\) 都最多只会贡献一次,考虑从 \(2n\) 个数里选出 \(n\) 个来作为贡献集合,然后判定它是否合法。

注意到一个事实:因为边权限制和最优化的方向是一样的,你可以直接去除这个限制:直接让每条边的边权为 \(a_u,b_v\) 中任选一个。反正不合法的肯定不会计入答案。

把点根据 \(a_i,b_i\) 有没有被选中分为四类。如果四种都有的话容易构造。如果只有 \(01\) 或只有 \(10\) 的话也可以。实际上这三个就是所有合法情况了。

所以判定:要么全选 \(a\),要么全选 \(b\),要么至少有一个点的 \(a,b\) 同时被选。

然后就是容易的了。

(#)9.5,*4000? adhoc AGC028E High Elements

给定一排列 \(P\)。求一个字典序最小的将 \(P_i\) 的每一位一次推入序列 \(A\)\(B\) 的方案(指 010110……),满足 \(A,B\) 的前缀最大值个数相同。判断无解。\(n\le 2\times 10^5\)

How maroonrk's mind works???

称前缀最大值为 high 位置。

字典序最优化问题考虑怎么判有解。假设现在我们确定了前面的 01 个数,那我们希望判断能不能让后面给 \(A,B\) 分配到的 high 位置,个数的差恰好为某个值。

然后出一个有点匪夷所思的结论:

  • 如果有解,这里一定存在一种分配方案使得 \(A\)\(B\) 中的 high 位,都是 \(P\) 中本来就有的 high 位。

如果 \(A\)\(B\) 有一个新的 high 位不是 \(P\) 的 high 位,那说明导致这个数不是 \(P\) 的 high 位的那个 \(P\) 的 high 位肯定在对面序列里。如果两边都有这样的 high 位,直接交换两个数就会让 \(A,B\) 两边的 high 位个数同时 -1,不改变个数的差。

这样问题的形式简单了不少。假设那个混了非 \(P\) high 位的序列是 \(B\),我们期望让新 high 位数 \(a-b=k\)

设当前有 \(p\)\(P\) 的 high 位,\(B\) 里出现了其中的 \(x\) 个,则 \(a=p-x\)\(p-x-b=k\implies 2x+(b-x)=p-k\)

可以转化到一个问题:设 \(P\) 中的 high 位权值为 \(2\),其余为 \(1\)。我们要找一个权值为 \(p-k\) 的上升序列作为 \(B\) 的 high 位。

由前缀最大值的一些性质可以证明这样的 LIS 一定能对应一个我们期望的 \(A,B\) 分配方案。而反向的对应是显然的。

然后又由于上述问题中,一个权值为 \(x(x\ge 2)\) 的方案可以调整为 \(x-2\) 的方案(抠掉一个 2 或两个 1),所以只用考虑奇偶的最大权值。

反过来跑一遍 LDS 状物即可每次处理询问。\(O(n\log n)\)

主要难点在于需要对前缀最大值的性质有过人的感知力。

6?,3500(3800)? DP AGC028F(F2) Reachable Cells

给定网格,每格有 \(1\sim 9\)。求所有存在右下可达路径的点对上的数乘积的和。\(n\le 500(1500)\),9s。

看这个与众不同的 subtask 出法(之前场次都是同一题里配部分分)的话这个 F2 原本应该是有点防 AK 性质的,但是被一堆常数优秀的从 F1 抄过来的 \(O(n^3)\) 给击穿了(笑)。虽然场上好像真有人写了复杂度对的做法。

出现了经典的不可正常做问题:DAG 可达域询问。这里 bitset 啥的不太有用(但还是被 \(O(n^4/\omega)\) 把 500 草过去了),所以考虑发掘此图的性质。

考虑 \(dp_{i+1,j},dp_{i,j+1}\) 转移上来算重了些什么东西。直接去掉 \(dp_{i+1,j+1}\) 吗?并非,可以算重到 \((i+1,j+1)\) 到不了的位置。

大概是这个样子:

画一画发现,由于一些平面图性质,我们似乎一定能把两边同时可到达的区域划分为,若干个点的可达域……?

考虑如何找到这些点。设 \((i,j)\) 能到达的第 \(k\) 行的列,最靠左的为 \(l_{i,j,k}\),最右的 \(r_{i,j,k}\)。一个性质是,对于 \(>i\) 的每一行,有 \(l_{i+1,j,k}\le l_{i,j+1,k},r_{i+1,j,k}\le r_{i,j+1,k}\),虽然到这里就没有特别大的参考意义了。

算重的一定是若干个 \((k,l_{i,j+1,k})\) 可达的区域,而且选中的 \(k,l_{i,j+1,k}\) 都有比较好的单调性。

可以维护从一个点最远能到达第 \(p_{i,j}\) 行,每次找到一个 \((k,l_{i,j+1,k})\) 之后,让 \(k\) 跳到这个点的 \(p+1\),然后找到下面第一个 \(r_{i+1,j,k}\le l_{i,j+1,k}\)\(k\),一直这样做下去。

\(O(n^3)\)。优化空间后可以过 F2。

(#)8,*3400? 网络流 AGC029F Construction of a tree

给定 \(n-1\) 个点集 \(E_i\)。要选定 \(n-1\) 条边,每条边的端点都在各自对应的点集中。构造一组方案使得边能形成一棵树或报告无解。\(n,\sum |E_i|\le 2\times 10^5\)

考虑一个二分图,左部点为 \(1\sim n\),右部点为 \(1\sim n-1\)。点 \(i\)\(E_j\) 中就连边 \((i,E_j)\)。看看怎么构造。

尝试在交错树上处理。

跑一个最大匹配(跑不出 \(n-1\) 的匹配显然无解),那么一定有一个左部点失配。从它开始在残量网络上交替走非匹配边-匹配边-非匹配边……如果能走到所有点,就得到了一棵生成树。

这棵树就对应了一个合法方案。

因为这个过程肯定形如,你从一条非匹配边走到右部点,然后再从一条唯一的匹配边走出去。又由于树的叶子肯定都由匹配边结尾(否则还能增广,不是最大匹配),所有每个右部点在树上的度数都恰好为 \(2\),直接当作它连的两个左部点之间右边,就得到了一棵我们想要的树。

如果不存在这样的交错树(走不到全部点),那显然爆了,这图压根就连不上。

5,*3207 构造 AGC030C Coloring Torus

给定 \(K\),构造 \(n\times n\) 方阵,满足恰好有 \(1\sim K\) 出现,并且对于每一对 \(1\le i,j\le K\),任何取到 \(i\) 的位置相邻的 \(j\) 的个数都相同。这里的“相邻”是循环意义下的。要求 \(n\le 500\)\(K\le 1000\)

不知道有什么启发性.jpg

容易有一个无脑构造:\(n=K\),第 \(i\) 行填 \(i\)。但是 \(n\) 太大了。我们希望能用 \(n\) 做到 \(K=2n\) 的构造效果,考虑在一行里多塞点东西。

\(4|n\) 时,可以 \(n=K/2\),奇数列填 \(2i-1\),偶数列填 \(2i\)

但是似乎只能让所有列同时奇偶填或者同时填一样的,如果这两种填法同时出现就必定会导致有一些行的奇偶位情况不同。

1 2 1 2
3 3 3 3
....

比如这里的 3。它们有些能只能连 1 有些只能连 2。考虑能不能魔改一下让每个 3 能连 1 也能连 2。

可以的。我们直接将上述构造旋转 \(45\degree\) 并同余。完事。这样就可以决策每列是否奇偶填以刚好凑出一个 \(K\)

6,*3700? adhoc AGC030E Less than 3

两个长度为 \(n\) 的 01 串 \(s,t\),每次可以把 \(s\) 的一位反转,但 \(s\) 在任何时刻都不能有连续三个相同字符。求变为 \(t\) 的最小次数。可以证明有解。\(n\le 5007\)

哎呀。。。

如果翻转了 \(s_i\),就说明 \(s_{i-1},s_{i+1}\) 不会都和它不同。

也就是说每个连续段都不会在序列中间凭空消失,它们的边界一定是左右移动的,除非走到了序列边缘。

考虑 \(s,t\) 的连续段分界线,并在首尾补无限条空的分界线。我们要做的就是把 \(s\) 的分界线调整到和 \(t\) 对应上,并且不在前后的分界线距离必须为 \(1\)\(2\)

...|||[0|1 1|0 0|1|0|1|0 0|1|0]|||...^----v
...|||[1 1|0|1|0|1|0 0|1 1|0 0]|||...

显然分界线的移动会有一个下界,又显然这个下界是可以取到的。

\(s,t\) 分界线的对应方案只有 \(O(n)\) 种,暴力枚举计算答案即可。

5,*3500? 计数 AGC030F Permutation and Minimum

给定一个 \(1\sim 2n\) 的排列 \(a\),中间有一些项被挖掉。求对于所有被挖掉的项的填法,它们能生成多少个 \(b\)\(b_i=\min(a_{2i-1},a_{2i})\)\(n\le 300\)

理应做出来这个题。刻画方向是完全正确的,DP 方法是全部错误的(

先把已经确定的 \(b_i\) 删掉。然后相当于每两个位置可能有一个 \(a_i\),或者可能没有。于是是这样一个问题:有值域在 \([1,2t]\) 间的 \(c_{[1,n]}\)。每个 \(c\) 会跟另一个没出现的数 \(x\) 匹配,如果 \(x<c_i\) 则每个 \(x\) 的方案都不同,否则算同一种方案。没有匹配上的数就自个配上。

考虑按值域 DP,对于上述的前者有序配,后者贪心配,顺序后面再乘。\(dp_{i,j,k}\) 表示值域 \([1,i]\) 的数中,有 \(j\) 个数要和 \(>i\) 的固定 \(c\) 匹配,有 \(k\) 个数(这些可以也是不固定的)要和 \(>i\) 的不固定数匹配。

  • \(i\) 被固定:\(dp_{i-1,j,k}\to dp_{i,j-1,k},dp_{i,j-1,k+1}\)
  • \(i\) 没被固定:\(dp_{i-1,j,k}\to (j+1)dp_{i,j+1,k}\)\(dp_{i-1,j,k}\to dp_{i,j,k-1}\)\(dp_{i-1,j,k}\to dp_{i,j,k+1}\)

记得乘 \((t-n)!\)\(O(n^3)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写体识别

手写数字识别:基于PyTorch的卷积神经网络实现 一、项目概述 使用PyTorch实现一个基于卷积神经网络(CNN)的手写手写数字识别模型,通过MNIST数据集训练,实现对手写数字(0-9)的分类识别。 二、环境依赖Python 3.x PyTo…

AGC 合集 1.0

AGC001~030。2025.3.10 - 2025.10.21。 收录了前 30 场 AGC 中我写了题解的题目。 如果附带了题目大意的话就是最近才做,或者是我过了几个月看不懂自己写的啥了重写了一遍。 如果您认为某些题目的理解不够到位,非常欢…

20231302邱之钊密码系统设计实验一第二

1.参考相关内容,在Ubuntu或openEuler中(推荐openEuler)中使用OpenSSL库编程实现调用SM2(加密解密,签名验签),SM3(摘要计算,HMAC 计算),SM4(加密解密)算法,使用Markdown记录详细记录实践过程,每完成一项…

你好,我是肆闲:C语言的学习,成长与分享旅程

大家好,我是肆闲。 今天,我写下了我的第一篇博客,就像一个程序员运行了第一段 print("Hello World")一样。代码简单,却标志着一个充满无限可能的新世界,在我眼前打开了大门。作为一个刚入门的小白,我对…

深入BERT内核:用数学解密掩码语言模型的工作原理

传统语言模型有个天生缺陷——只能从左往右读,就像你现在读这段文字一样,一个词一个词往下看,完全不知道后面会出现什么。人类可不是这么学语言的。看到"被告被判**_**",大脑会根据上下文直接联想到&quo…

ZR 2025 NOIP 二十连测 Day 6

100 + 72 + 35 + 0 = 207, Rank 61/131.啊啊啊第一次上 200 /oh25noip二十连测day6 链接:link 题解:题目内 时间:4.5h (2025.10.21 13:40~18:10) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\)*1200估分:100 + 7…

20251021

上午工程实训课接触了电工基础,老师演示了万用表测量、简单电路连接和安全操作规范 下午英语课围绕旅游主题展开听力, 晚上写离散数学作业 间隙用碎片时间整理了课堂笔记,还讨论了实训课上的电路连接问题。 (工程实…

[论文笔记] Precision-Guided Context Sensitivity for Pointer Analysis

Introduction Context-sensitivity 会带来静态分析的精度提升,但是也会带来巨大的开销,这引出一个关键的问题:能否在某些对整体分析的精度有重要影响的函数上选择性的使用 context-sensitivity?这个问题的难点在于…

英语_备忘_疑难

好的,这里有一些关于 **How** 和 **What** 在感叹句中使用的例题,涵盖了常见的规则和易错点。 **规则回顾:*** **What + (a/an) + 形容词 + 名词*** **How + 形容词/副词 + (主谓)** --- **例题:** 请选择正…

朋友圈文案不会写?这个AI指令可能帮得上忙

最近在整理AI提示词的时候,顺手写了个朋友圈文案生成的指令。本来只是自己用,后来发现身边朋友也有这个需求,就想着分享出来。写在前面 刷朋友圈的时候,你有没有发现:有些人随便发个照片配几个字,点赞评论一大堆…

「JOISC2020-掃除」题解

题解记录掃除 (Sweeping) sol 从 Subtask 3 的特殊性质入手,可以发现一个关键性质:无论之后如何操作,这个单调性在任何时刻均满足。其原因可以简单考虑一下操作的效力范围与结果得到。 理解之后容易推广到全局,不难…

职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能

职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能Reactor单线程模型 在Reactor单线程模型中,所谓的“单线程”主要针对I/O操作而言,即所有的I/O操作(如accept()、read()、write()和connect())都在同一个…

数学题刷题记录(数学、数论、组合数学)

P5686 [CSP-S2019 江西] 和积和简单题,直接将区间求和转换成前缀和,设 \(A_i = \sum_{i = 1}^n a_i,B_i = \sum_{i = 1}^n b_i\),那么式子为: \[\sum_{l = 1}^n \sum_{r = l}^n (A_r-A_{l-1})(B_r-B_{l-1}) \]\[=\…

记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600)---惜分飞

记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600)---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600) 作者:惜分飞…

CF简单构造小计

记录在这的都是感觉比较妙的或者看了题解的( CF2155D Batteries有 \(n\) 个元素,其中有 \(a\) 个是好的( \(a\) 未知)。 每次你可以询问一对元素,返回1当且仅当两个元素都是好的,否则返回0。 在 \(\lfloor\frac{…

软件工程第三次作业:四则运算题目生成器 - Nyanya-

四则运算题目生成器 - 结对项目报告项目信息 详情课程 软件工程作业要求 结对项目项目目标 实现一个四则运算题目生成器,支持有理数运算,规范软件开发流程,熟悉结对编程结对成员 姓名1: [杨浩] 学号1: [3123004462]…

ORA-600 kokasgi1故障处理(sys被重命名)---惜分飞

ORA-600 kokasgi1故障处理(sys被重命名)---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:ORA-600 kokasgi1故障处理(sys被重命名) 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有…

简单页面聊天

import express from express import http from http import { Server } from socket.io import cors from corsconst app = express() const PORT = process.env.PORT || 3001app.use(cors({ origin: [http://localho…

深入认识ClassLoader - 一次投产失败的复盘

问题背景 投产日,同事负责的项目新版本发布,版本包是SpringBoot v2.7.18的一个FatJar,java -jar启动报错停止了,输出的异常日志如下: Caused by: org.springframework.beans.factory.BeanCreationException: Erro…