AtCoder AGC074 总结

AtCoder AGC074 总结

A

赛时一个多小时通过。考虑特殊点。由于是有向无环图,考虑入度为 0 的点。考虑怎么区分多个入度为 0 的点,由于这些点中一定有一个点取到当前可选值域的最小值,所以想到 select 除了最小值以外的点,此时自然可以确认最小值所在的点,即对答案的贡献为零度点个数减一。

考虑到每个零度点都有一个下界,那么我们还可以根据下界区分这些零度点。所以用堆每次把下界最小的零度点取出来做上述过程,然后插入所有新的零度点。求一个点的下界可以用 set 维护可选值域,然后每次删掉一条边 \((u,v)\) 时就在 set 中查第一个大于 \(p_u\) 的值,然后更新 \(v\) 的下界。

复杂度 \(O(n\log n)\)

B

操作一个 \(0\dots01\)\(10\dots0\) 相当于把两个 1 分别往两个方向移动相同长度。

\(a_i,b_i\)\(A,B\)\(i\) 个 1 的位置。考虑每次找到两个 \(a_i<b_i,a_j>b_j\),然后移动 \(\min(b_i-a_i,a_j-b_j)\),可以分别找到最右的和最左的这样就不会影响其他。这样每次都会使一个 \(1\) 移到正确位置,移动次数最大为 \(1\) 的个数,若超过 \(n/2\) 则对 \(0\) 做同样的事情即可。

C

考虑或上 \(A_i\) 的意义,相当于 \(P\) 只保留 \(A_i\) 为 0 的位然后求 LIS。

考虑到 \(N=2^{10}\),值域等于 \(2^{30}\),考虑倍增构造,保证每次长度翻倍要使值域最多多使用三位。分 \(N\) 的奇偶性讨论,记 \(X\) 为最高位的下一位:

  • \(N\) 为偶数时,考虑从 \(N-1\) 构造,可以在 \(p\) 结尾插入 \(2^{X}\),这样使所有的 LIS 加一,然后再在 \(A\) 开头插入 \(2^{X}-1\),这样就构造出了 \(P\text{ or} A_1\) 的 LIS 为 \(1\)
  • \(N\) 为奇数时,考虑从 \((N-1)/2\) 构造, 可以构造 \(P=[p,p\text{ or }2^X,2^{X+1}],A=[2^{X+2}-1,a_1+2^{X+1},a_1,\dots ,a_k+2^{X+1},a_k]\)
posted @ 2025-10-27 21:00  dengchengyu  阅读(13)  评论(0)    收藏  举报