AtCoder 记录

  • \(\texttt{ARC118D Hamiltonian Cycle}\)

    首先找到最小的 \(n\) 满足 \(a^n\equiv 1\pmod{p}\),最小的 \(m\) 满足 \(b^m\equiv 1\pmod{p}\),有解的充要条件是 \(n*m = p-1\),直接构造一组解即可。

    \(\texttt{ac记录}\)

  • \(\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{ac记录}\)

  • \(\texttt{AGC017D Game on Tree}\)

    经典树上博弈,每个节点的 \(sg\) 函数值等于它的子节点的 \(sg\)\(+1\) 的异或和。

    证明:
    设当前点为 \(u\),首先将 \(u\) 的所有儿子分开,将 \(u\) 复制多份每个点连向一个儿子,就变成了若干个子游戏,\(sg(u) = \bigoplus sg(u')\)

    对于每个 \(u'\)\(sg(u') = sg(son(u')) + 1\),归纳法即可证明。

    \(\texttt{Code}\)

  • \(\texttt{AGC027F Grafting}\)

    想了个垃圾假做法,喜提只过样例的好成绩 /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{ac记录}\)

  • \(\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{ac记录}\)

  • \(\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{ac记录}\)

  • \(\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{ac记录}\)

  • \(\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\) 即可。

    \(\texttt{ac记录}\)

posted @ 2021-12-21 15:55  klii  阅读(74)  评论(0)    收藏  举报