2025.5
[AGC071C] Orientable as Desired
5.14
做了一下午,完全没有什么可靠的想法。
首先如果 \(G\) 不是二分图则一定是 Yes,这个第一眼就看出来了。
然后思考 \(G\) 是一棵树,好像这种情况全是 No?
否则猜测答案一定是 Yes,显然没道理。
然后就没有什么思路了,写了个搜,搜出一种情况,大约形如基环树环下面悬挂着一些点,且每个环上的点都有点挂,这种情况答案是 No。
对着样例研究了一会儿,我发现关键在二度点:如果有二度点 \(v\),则钦定 \(x_v=0\),然后缩成一条边。这个时候如果 \(v\) 在一个偶环上缩点之后 \(G\) 就成了非二分图,进而答案为 Yes。
事实证明这个条件还不必要。虽然在稀疏图上大概率是对的,但在稠密图上就错完了,构造一个完全二分图就可以卡掉。
看题解。题解说:
- 对于任意一个 \(u\),将 \(u\) 从原图中删去会得到若干连通块 \(S_1,S_2,…,S_k\),设 \(S_i\) 中的点在原图中有 \(a_i\) 个点与 \(u\) 相邻,则 \(X_u\) 必须可以被 \(a_1,a_2,…,a_k\) 凑出来。
- 若图是二分图,且满足以上条件,则一定无解;否则一定有解。
这也太神秘了!这谁想得到???
事实上和题解的距离在于如何想到设定 \(x\) 序列为除了 \(x_p\) 非 \(0\) 其他全 \(0\),并思考这种情况下的判定。
补一个证明。
点击查看
充分性:上面已经说过了,假设 \(x=\{0,...,0,x_p,0,...,0\}\)。
必要性:
[AGC070A] Multiples in the String
5.15
去年打过的一场,现在补了。
大概需要做到 \(|S|\) 和 \(1000\) 同阶。
我们知道一个很神奇的数字:\(1/7=0.142857142857...\)。它的 \(1\) 倍,\(2\) 倍,\(3\) 倍,一直到 \(1/7\) 的 \(6\) 倍 \(6/7\) ,在小数部分都是 \(1/7\) 的循环移位。
如果我们能找到一个优秀的素数 \(p>1000\),使得在十进制下,\(\frac 1p\) 也具有像 \(1/7\) 一样的性质,那么我们就找到了一组构造。
引理:
\(p\) 满足条件当且仅当 \(1/p\) 的小数部分循环节为 \(p-1\)(显然这种情况之下一定为纯循环小数),当且仅当 \(10^t\equiv 1\pmod p\) 的最小解为 \(t=p-1\)。
而 \(1019\) 刚好能满足。
[AGC071A] XOR Cross Over
5.15
之前打过这场不会这题。早上做了一下。
考虑一个区间 dp,设 \(f_{l,r}\) 表示区间 \([l,r]\) 内的局部之解。这样记录信息是不够的,还要再记一维 \(k\) 表示有 \(k\) 个仍然具备可能延伸到区间外的条件,而剩下的 \(r-l+1-k\) 个就已经被锁定在区间内部了,\(f_{l,r,k}\)。
有两种转移:
- \(f_{l,r,k}\to f_{l-1,r,k'}\) 或 \(f_{l,r,k}\to f_{l,r+1,k'}\)(加一个单点)。
- \(f_{l,m,k_1}+f_{m+1,r,k_2}\to f_{l,r,k}\)(合并两边,这时需要分讨两边的长度奇偶,如果另一边为奇数就被阻断在此处,无法继续向外延伸)。
这样已经可以 poly,但复杂度明显还不够。
注意到 \(0\le k\le 1\),然后复杂度变为 \(O(n^3)\)。
你可以讨论所有情况,可以归纳得出若 \(k\ge 1\),则区间长度一定为奇数,而合并过程中一定不会同时保留,所以 \(k\le 1\)。
【IOI2020】Stations
5.16
树上的标号问题,考虑 DFS 序或 BFS 序。
因为要求的是构造一个对结点的重标号使得能够区分子树关系,考虑 DFS 序。这样的问题是无法区分询问的 \(T\) 在不在 \(S\) 的子树内,还需要知道 \(S\) 的出栈序。
注意到我们可以获取的信息还包括 \(S\) 的标号。对树做黑白染色,对黑点记录入栈序,对白点记录出栈序,利用这些信息足以判断。因为我们只需要知道大小关系,所以只需要离散化为 \([0,n-1]\) 的排列即可。
[AGC068B] 01 Graph Construction
5.19
算是自己做出的第一道 agc 题目,虽然好像很多人场切了。
这样构造出的图形态很有限:任何一个点的度数都恰好为 2,所以是若干个环。
所以要构造把同一个等价类的点连成一个大环。
先复制:把每个点都复制成两份,一个入点一个出点,方便以后连边。连边时就连接一个出点和一个入点。
111 000 111
000 000 111
\(n=3\) 时,如上构造就可以完成。第一组表示出点,后接 0;第二组后表示入点,后接 1。
再连边:
把要连接的每一对点 \((u,v)\) 依次连接。
111 000 111 11000
000 000 111 11100
还是 \(n=3\),上面展示了连接点 \(1\) 的出点和点 \(3\) 的入点的一种方法。
剩下的点依次保留下来。如果要连接多组 \((u,v)\),就在后面一个一个连上即可。
[AGC067C] Divisibility Homomorphism
首先判掉前 \(m\) 项不合法。
然后注意到我们需要不改变整除性,而整除性只和质因数的幂次有关。所以令 \(x_n=f(n)a(n)\)。\(f(n)\) 表示将 \(n\) 的质因数各自偏移一个常量 \(c\) 后的结果,\(a(n)\) 表示所有 \(\le m\) 的因子 \(d\mid n\) 的 \(a_d\) 的 \(\operatorname{lcm}\)。然而可能有一种情况:对于一对 \(\le i\le m<j\),\(a_i\mid a(j)\),而 \(i\) 却不整除 \(j\) 的任何一个 \(\le m\) 的因子。只需要判断这种情况是否存在就好了。
剩下的不会了。
[AGC072E] Flights 2
神仙题,思路来自 apio 讲课。
二分答案,
设 \(f_i\) 表示在点 \(i\) 没现金时最多有多少张票,\(g_i\) 表示没票时最多的钱。
转移有:
- \(f_u\to g_u\) \(O(1/n)\)
- \(f_u\to f_v\) \(O(1)\)
- \(g_u\to g_v\) \(O(1)\)
- \(g_u\to _w\to f_v\) \(O(n)\)
如果暴力执行 \(n\) 轮转移,时间复杂度为 \(O(n^4\log 1/\epsilon)\)。
先想着去掉 \(\log 1/\epsilon\):转置,反之设 \(f_i\) 表示从 \(i\) 没钱时至少要多少张票才能到 \(n\),\(g_i\) 表示没票时至少要多少钱。
转移:
- \(g_u\to f_u\) \(O(1/n)\)
- \(f_u\to f_v\) \(O(1)\)
- \(g_u\to g_v\) \(O(1)\)
- \(f_u\to _w\to g_v\) \(O(n)\)
则答案为 \(g_1\)。此时时间复杂度为 \(O(n^4)\)。
进一步,观察到四种转移的时间复杂度有很大不同,因此考虑平衡时间复杂度,即减少第四种转移的转移次数。
对 \(f\) 或 \(g\) 内部做一轮更新的时间复杂度可以用 dijkstra 来到 \(O(n^2)\)。问题在于 \(f\to g\) 的转移,可以这样完成:
- 对 \(g\) 做一轮更新。
- 取出 \(f\) 最小的点更新 \(g\) 以及周围的 \(f\)。
- 重复以上过程 \(n\) 轮,直到所有点都被取出一次。
则时间复杂度为 \(O(n^3)\)。
上面是 lhf 在 apio 的解题思路,但是真有这么做的必要吗??
我们注意到,在转移过程中,\(Money+Tickets\) 的值始终不减。
实际上,\(V=Money+Tickets\times (1-\epsilon)\) 的值是严格递增的,其中 \(\epsilon\) 是一个足够小的正实数。
所以 \(V\) 较大的点是不会通过一些手段来更新 \(V\) 较小的点的。类似 dijkstra 做 \(2n-1\) 轮更新,每一轮次里直接取出 \(V\) 最小的点更新周围的点即可。注意由于 \(\epsilon\),对于数值相同的 \(f\) 和 \(g\),要优先选择 \(g\)。
这样做甚至不需要有任何对平衡四种转移的复杂度的考虑。

浙公网安备 33010602011771号