AGC 052
[AGC052A] Long Common Subsequence
skip。
[AGC052B] Tree Edges XOR
给定一棵树,每条边有初始权值和目标权值,每次可以选择一条当前权值为 \(w\) 连接 \(u\),\(v\) 的边,将其他与 \(u\) 或 \(v\) 相连的边权值异或 \(w\)。判断是否能通过若干次操作将所有边变成目标权值,满足点数为奇数。\(1 \le N \le 10^5\)
赛时读完感觉是自己不擅长的直接跳了。
sol:
我们设 \(f_u\) 表示与 \(u\) 相连的边被异或上了多少,一条边的最终权值即 \(f_u \oplus f_v\),每次操作就是将 \(f_u\) 和 \(f_v\) 都异或 \(w\),容易发现这相当于交换相邻两个点的点权。初始设 \(f_u\) 时需要满足 \(f_{u_i}\oplus f_{v_i}=w_i\) 。只要确定一个点其他点也就确定了。也就是说我们只要找到一种方式给初始状态和目标状态分别赋点权 \(f_u\),\(g_u\) 得到的可重集\(f,g\)相同。我们可以给两种状态 \(f_1\),\(g_1\) 都赋值为 0,再进行对比。但这样有个问题,如果我们把 $ g_1$赋值为 \(x\) 对应的 \(g\) 中所有数都会异或上 \(x\) 有可能这是一种合法方案我们没有统计到。但是题目满足点数为奇数,所以只有一个固定的 \(x\) 可能合法,带入判定即可。
[AGC052C] Nondivisible Prefix Sums
给定一个素数 \(P\)。对于一个整数序列 \(A_1,\ A_2,\ \dots,\ A_N\),如果可以重新排列这些元素,使得任意前缀和都不能被 \(P\) 整除(即,重新排列后,对于所有 \(1 \le i \le N\),都不存在 \(A_1 + A_2 + \dots + A_i \equiv 0 \pmod{P}\)),那么称这个序列为好序列。长度为 \(N\) 的整数序列,每个元素都在 \(1\) 到 \(P-1\) 之间(包含 \(1\) 和 \(P-1\)),这样的序列一共有 \((P-1)^N\) 种。请问其中有多少个好序列。
赛时几乎做出来了,列了一个比较唐的生成函数,最后有个地方组合数过大需要 \(O(n)\) 求,导致复杂度退化为 \(O(N^3)\),但赛后发现\(P>N\) 的 情况可以单独 \(O(N)\) 求解即可。
sol:
很容易猜到一个条件:\(cnt_1\le P-1+\sum P-B_i\),且序列总和不为 \(P\) 的倍数,其中 \(cnt_1\) 是 1的个数,\(B\) 是去掉 1之后的序列。很容易发现在 1 为众数的时候这个条件是充要的,并且不满足条件时 1 是绝对众数。
对于众数为 \(x\) 的情况,只需要将序列所有数乘 \(x\) 在 \(\bmod P\) 意义下的逆元即可,于是我们只需要统计 众数为 1的情况。
合法情况统计有一定困难,于是我们用总方案数 - 和为 \(P\) 倍数的方案数 - 和不为 \(P\) 的倍数且不满足 \(cnt_1\le P-1+\sum P-B_i\) 的方案数。
两种不合法情况都可以简单DP求出。
[AGC052D] Equal LIS
给定一个 \(1\) 到 \(N\) 的整数的排列 \(P_1,\ P_2,\ \dots,\ P_N\)。请判断是否可以将其分成两个子序列,使得这两个子序列的最长上升子序列的长度相等。
形式化地说,目标是找到满足以下所有条件的两个整数序列 \(a,\ b\):
- \(a,\ b\) 都是 \(P\) 的子序列。
 - 每个整数 \(i=1,2,\cdots,N\) 恰好只在 \(a\) 或 \(b\) 中出现一次。
 - (\(a\) 的最长上升子序列的长度)\(=\)(\(b\) 的最长上升子序列的长度)。
 
请判断目标是否可以达成。
赛时被C卡住没做到这道题,场下40min做了出来,第一次切铜牌题!
sol:
求出最长上升子序列 \(S\) ,设 \(f_i\) 为以 \(i\) 结尾的最长上升子序列。
如果 \(S\) 是偶数,我们只需要将\(f_i\le \frac S2\) 和 \(f_i > \frac S2\) 的位置分别分成一个子序列即可。所以一定合法。
如果 \(S\) 是奇数,设 \(S=2x+1\),我们用类似的方法将 \(f_i\le x\) 和 \(f_i > x\) 的位置或者是 \(f_i< x\) 和 \(f_i \ge x\) 的位置分开。 但此时两个子序列的最长上升子序列长度分别为 \(x\) 和 \(x+1\) ,于是我们需要有一条长为 \(x+1\) 不被 \(S\) 完全包含的上升子序列 \(T\) 将他分进当前最长上升子序列少的那一半。判断时可以正反各做一遍最长上升子序列得出每个点所在的最长上升子序列长度即可。