AtCoder 记录
-
\(\texttt{ARC118D Hamiltonian Cycle}\)
首先找到最小的 \(n\) 满足 \(a^n\equiv 1\pmod{p}\),最小的 \(m\) 满足 \(b^m\equiv 1\pmod{p}\),有解的充要条件是 \(n*m = p-1\),直接构造一组解即可。
-
\(\texttt{AGC016F Games on DAG}\)
\(1,2\) 号点的石头是两个独立的游戏,因此最终先手必胜满足 \(sg(1)\neq sg(2)\),考虑求 \(2^m\) 减去使得 \(sg(1) = sg(2)\) 的方案数。
给点按 \(sg\) 函数值分层,从大到小考虑,设 \(S\) 为 \(sg > x\) 的点集,\(T\) 为 \(sg=x\) 的点集,则:
-
每个 \(u\in S\) 至少存在一条 \(u\longrightarrow T\) 的边;
-
\(T\longrightarrow S\) 的边可以随便连;
-
\(T\longrightarrow T\) 的边不可以连;
-
\(1,2\) 号点必须同时加入 \(S\)。
状压 \(dp\) 即可,时间复杂度 \(\mathrm{O(n3^n)}\) 。
-
-
\(\texttt{AGC017D Game on Tree}\)
经典树上博弈,每个节点的 \(sg\) 函数值等于它的子节点的 \(sg\) 值 \(+1\) 的异或和。
证明:
设当前点为 \(u\),首先将 \(u\) 的所有儿子分开,将 \(u\) 复制多份每个点连向一个儿子,就变成了若干个子游戏,\(sg(u) = \bigoplus sg(u')\)。对于每个 \(u'\),\(sg(u') = sg(son(u')) + 1\),归纳法即可证明。
-
想了个垃圾假做法,喜提只过样例的好成绩 /cy
分两类:
-
枚举一个不操作的点,记作 \(u\),在 \(A,B\) 两个树中分别以 \(u\) 为根遍历整棵树,得到每个点的父亲,则有:
-
对于点 \(v\) ,若 \(fa_A(v) = fa_B(v)\),则 \(v\) 不会被操作;
-
若在 \(B\) 中,点 \(v\) 不会被操作而 \(fa_B(v)\) 需要被操作,则该情况无解;
-
若 \(fa_A(v) != fa_B(v)\),则 \(fa_A(v)\) 必然晚于 \(v\) 被操作,\(v\) 必然晚于 \(fa_B(v)\) 被操作,这得到了偏序关系,拓扑排序判断是否有环即可判断是否无解。
时间复杂度 \(\mathrm{O(n^2)}\)。
-
-
某些方案中所有的点都被操作过,这种情况下直接枚举第一次操作的叶子节点 \(u\),将 \(u\) 所连的边换掉,做一次第一次操作即可。
时间复杂度 \(\mathrm{O(n^3)}\)。
总时间复杂度为 \(\mathrm{O(Tn^3)}\)。
-
-
\(\texttt{AGC029C Lexicographic constraints}\)
先二分答案 \(sz\):
对于 \(i \in [2,n],a_i > a_{i-1}\),可以直接在后面加上一串最小的字符;
对于 \(i \in [2,n],a_i \le a_{i-1}\),最优的方案一定是将 \(s_{i-1}\) 的 \((a_i,a_{i-1}]\) 位都去掉,第 \(a_i\) 位的字符 \(+1\),若超过 \(sz\) 则需要进位。
然后我憨憨的拿 \(map\) 去维护,并且离谱地去掉 \((a_i,a_{i-1}]\) 的位时没有 \(erase\) 掉 \(map\) 里的点 /qd
(于是成功TLE实际上拿个栈维护就好了 /kk
时间复杂度 \(\mathrm{O(n \log n)}\)。
-
\(\texttt{AGC043C Giant Graph}\)
显然最优解是按 \(i+j+k\) 从大到小能取就取,于是就有了 \(O(n^3)\) 做法。
然后就不会了给两点间的边定向,由 \(i+j+k\) 小的连向 \(i+j+k\) 大的,那么对于一个点,它能取当且仅当它的 所有出边 都没取。
这就转化成了一个博弈问题。
由于三维是互不干扰的,那么 \(SG(i,j,k) = sg(i) \oplus sg(j) \oplus sg(k)\),由于点的 \(sg\) 函数值是根号级别的,可以直接暴力求,
那么答案就是所有必败态的点的权值和。时间复杂度 \(\mathrm{O(n\sqrt n)}\)
-
\(\texttt{AGC052C Nondivisible Prefix Sums}\)
首先有个前提是 \(\sum\limits_{i=1}^n A_i \not\equiv 0 \pmod{p}\),下面假设该条件成立。
设 \(x\) 为序列 \(A\) 的众数,出现次数为 \(cnt\),将所有的数乘上 \(x^{-1}\),记大于 \(1\) 的数为 \(B_1,B_2,...,B_k\),
则序列 \(A\) 是 \(good array\) 满足: \(c\le p-1 + \sum\limits_{i=1}^k (p-B_k)\),证明见 \(\texttt{Editorial}\),更清晰。
(绝对不是懒先求出 \(\sum\limits_{i=1}^n A_i \not\equiv 0 \pmod{p}\) 的序列 \(A\) 的方案数,记作 \(f_n\),则有:
\[f_i = f_{i-1}(p-2) + ((p-1)^{i-1}-f_{i-1})(p-1) \]化一下柿子可以发现这等价于
\[f_i = (p-1)^i - f_{i-1} \]求出来之后需要减去不满足 \(c\le p-1 + \sum\limits_{i=1}^k (p-B_k)\) 的序列数,记 \(dp(i,j)\) 表示 \(i\) 个大于 \(1\) 的数,\(\sum\limits_{k=1}^i(p-B_k) = j\) 的方案数,直接暴力 \(dp\) 是 \(\mathrm{O(n^3)}\) 的,加个前缀和优化即可做到 \(\mathrm{O(n^2)}\)。
然后对于 \(dp(i,j)\),若 \(n-i\ge j + p\) 且 \(n-i-j\not\equiv 0\pmod{p}\)(相当于 \(\sum\limits_{i=1}^n A_i \not\equiv 0 \pmod{p}\)),则答案减去 \(\dbinom n i dp(i,j)\)。
于是就做完了,时间复杂度 \(\mathrm{O(n^2)}\)。
-
\(\texttt{AGC052B Tree Edges XOR}\)
建一个虚拟节点 \(0\) 连向 \(1\),记 \(a_i\) 表示边权均为 \(w_1\) 时 \(0\rightarrow i\) 的边权异或和, \(b_i\) 表示边权均为 \(w_2\) 时 \(0\rightarrow i\) 的边权异或和。
一次操作等价于将 \(a_u,a_v\) 交换,则给 \(0\rightarrow 1\) 的边权定一个权值 \(W\) 需满足:
\(1.a_i \oplus W = b_i \longrightarrow a_i \oplus b_i = W\)
\(2.(b_1\oplus W, b_2\oplus W,...,b_n\oplus W)\) 是 \((a_1, a_2,...,a_n)\) 的排列
题目给了一个性质:\(n\) 为奇数,那么有 \(\bigoplus\limits_{i=1}^n a_i\oplus b_i = W\),\(W\) 就确定了,于是就判定是否符合条件 \(2\) 即可。