AGC 001 题解

\(A:\) 排序模拟

\(B:\) 规律题,答案就是 \(3(n - gcd(n,x) )\).

\(C:\)

如果 \(m\) 是偶数,枚举直径的中点 \(k\) ,那么 \(dis(k,i) \ge \frac m 2\) 都要被删去,通过一次 \(dfs\) 找出。
如果 \(m\) 是奇数,枚举直径的中间边\(E\) ,从 \(E\)\((u, v)\) 两个节点开始 dfs。

\(D:\)

我们根据题目给出的回文串的划分,将两个相同的字符之间连边。
那么有解的充要条件就是图连通,所以 \(a_i\) 中奇数的个数不多于 \(2\) 个。
因为奇数回文串会少连一条边,而图联通时至少是一棵树,此时有 \(n-1\) 条边。
考虑构造方案肯定是要把整个序列交错开来,我们先把两个奇数放在原序列的两端,输出此时的序列。
再将 \(a_1 = a_1 +1\) , \(a_n = a_n -1\) ,此时的 \(a\) 就是 \(b\) 数组。
发现这样本质上是一个平移,恰好可以使得序列交错。特别的要注特判 \(n = 1\) 的情况。

\(E:\)

\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} \binom{a_i+a_j+b_i+b_j}{a_i+a_j}\)
根据组合意义,\(\binom{x+y}{x}\) 可以表示在坐标系上只能向上和向右走从 \((0,0)\) 走到 \((x,y)\) 的方案数。
那么 \(\binom{a_i+a_j+b_i+b_j}{a_i+a_j}\) 则表示 \((-a_i,-b_i)\)\((a_j,b_j)\) 的方案数。
\(f_{i,j}\) 表示以 \((i,j)\) 作为结束点的总方案 ,所以 :

\[f_{i,j} = f_{i-1,j} + f_{i,j-1} + sum_{i,j} \]

\(sum_{i,j}\) 表示有多少个 \(k\) 满足 \(-a_k = i\)\(-b_k = j\)
然后减去每个 \((-a_i,-b_i)\)\((a_i,b_i)\) 的贡献,也就是 \(\binom{2(a_i+b_i)}{2a_i}\),最后答案除以\(2\)

\(F:\)

我们考虑构造一个序列 \(Q\) 使得 \(Q_{p_i} = i\) ,所以对于原序列的操作转化为 :交换两个差值 \(\ge k\) 的相邻位置。
如果 \(Q_i - Q_j \le k\),那么 \(i,j\) 的相对位置就固定了。
将这个限制转换到 \(P\) 上,就是说如果两个位置 \(|i-j| \le k\) ,那么交换后 \(P_i\)\(P_j\) 的 相对大小关系与原序列相同。
所以我们按照上述规则建图,显然会建出一个 \(DAG\) ,答案就是给每个点标上编号使得原图的拓扑序最小。
直接显式建图是 \(O(n^2)\) 的,用线段树优化建图可以达到 \(O(n log_2 n)\)的时间复杂度。
具体的说,我们倒序枚举 \(i\) 编号标在哪个点上,模拟拓扑排序的过程,每次从优先队列取出当前入度为 \(0\) 且最靠后的的位置 \(u\) 。然后将 \(i\) 标在这个位置 \(u\) 上,然后去更新 \(u\) 连岀的点。
至于为什么是倒序而不是正序,我本人讲不清楚,可以看一下 兔队的博客

posted @ 2022-03-07 17:39  Isenthalpic  阅读(59)  评论(0编辑  收藏  举报