AtCoder Beginner Contest 302 (G,Ex)

开大号 unrated 写了个 Ex 就去玩原神了。赛后写了下 G。

ABC302Ex

简单题。考虑一组询问咋做,把所有 \((A_i,B_i)\) 连边建图,显然答案是点数减去是树的连通块个数。

如何维护形态为树的连通块个数?可以用并查集维护,对每个连通块额外维护连通块内边数即可。

树上咋做?dfs 一遍,用可撤销并查集维护即可。\(O(N\log N)\)

带撤销并查集写了个路径压缩,调了一年

AC Code

ABC302G

简单题。考虑算出 \(1,2,3,4\) 各自的个数,然后把序列分成四段。设 \(a_{i,j}\) 表示在第 \(i\) 段中 \(=j\) 的元素个数,其中 \(1\le i,j\le 4\)。我们的目标是让所有 \(i\neq j\)\(a_{i,j}\) 都变成 \(0\)

显然,同一段内的操作是没用的。每次操作如果交换了两个数 \(x,y\),他们分别在 \(i,j\) 这两段里,那么对 \(a\) 的影响就是:

  • \(a_{i,x}\leftarrow a_{i,x}-1,a_{i,y}\leftarrow a_{i,y}+1\)
  • \(a_{j,x}\leftarrow a_{j,x}+1,a_{j,y}\leftarrow a_{j,y}-1\)

然后对每行依次考虑,发现最优策略一定是先把形如 \((i,j)\)\((j,i)\) 这样的位置消成 \((i,i),(j,j)\),然后剩下的再匹配。由于 \(A_i\le 4\),就算是第一行在匹配的时候也必然会在某一侧只留下一个非零元素,因此匹配方案是唯一的,可以保证最优。

AC Code

posted @ 2023-05-22 07:39  云浅知处  阅读(70)  评论(0编辑  收藏  举报