AGC038F

题面

给定两个 \(0 \sim (N - 1)\) 的排列 \(\{P_0, P_1, \ldots , P_{N - 1}\}\)\(\{Q_0, Q_1, \ldots , Q_{N - 1}\}\)

要求构造两个 \(0 \sim (N - 1)\) 的排列 \(\{A_0, A_1, \ldots , A_{N - 1}\}\)\(\{B_0, B_1, \ldots , B_{N - 1}\}\)

且必须满足条件:

  • \(A_i\) 要么等于 \(i\),要么等于 \(P_i\)
  • \(B_i\) 要么等于 \(i\),要么等于 \(Q_i\)

你需要最大化 \(A_i \ne B_i\) 的下标 \(i\) 的数量,输出这个最大值。

数据范围:\(1 \le N \le {10}^5\)

题解

首先要注意到 \(A,B\) 也必须是排列,然后分析一下如果我们让 \(a_i=i\) ,那么为了让 \(A\) 最后还是一个排列,其他位置会产生什么变化。

发现就是对于一个 \(i\rightarrow p_i\) 的环上每一个位置 \(x\) ,其 \(a_x=x\)

那么我们就考虑把每一个这样的环看成点,初始是白色,如果执行 让所有 \(a_x=x\) 的操作就认为是把点染成白色。

然后我们对每个 \(i\) 分析一下它会带来的贡献,(\(id1,id2\) 分别表示在 \(p,q\) 所在的环的标号)。

  • \(p_i=i,q_i=i\) :没有贡献。
  • \(p_i=i,q_i\neq i\) :若 \(id1_i\) 是白色就有 \(1\) 的贡献。
  • \(p_i\neq i,q_i= i\) :若 \(id2_i\) 是白色就有 \(1\) 的贡献。
  • \(p_i\neq i,q_i\neq i,p_i\neq q_i\) :若 \(id1_i,id2_i\) 不同时是黑色就有 \(1\) 的贡献。
  • \(p_i\neq i,q_i\neq i,p_i= q_i\) :若 \(id1_i,id2_i\) 一个是黑色,一个是白色就有 \(1\) 的贡献。

看起来还是不会。

但是注意到一个点只有两种颜色,并且贡献的方式是 \(x\) 是白/黑,\(y\) 是白/黑的时候可以有 \(1\) 的贡献,就要想到网络流模型中P1361 小M的作物

但是!注意到这里我们的贡献模式并不适用,也就是如果把 \((0,0),(1,1)\) ( 全是白色,全是黑色) 看成合法的贡献形式,这里的贡献形式不仅有 \((0,1)\)\(x\)是白色,\(y\)是黑色) ,更重要的是有" \((0,1)\)\((1,0)\) (一个是白色,一个是黑色)会产生 \(1\) 的贡献"。

虽然不能直接套用,但是我们注意到 \(n\le 10^5\) ,所以 \(n\sqrt n\) 的二分图网络流也是一种可以思考的方向。

正着不好做,那么我们就尝试反着做。

重新考虑一下贡献,前三个是好考虑的,考虑最后两个:

  • \(p_i\neq i,q_i\neq i,p_i\neq q_i\) :若 \(id1_i,id2_i\) 同时是黑色就有 \(1\) 的代价。
  • \(p_i\neq i,q_i\neq i,p_i= q_i\) :若 \(id1_i,id2_i\) 同时是黑色,或同时是白色就有 \(1\) 的代价。

考虑最小割,仿照P1361 小M的作物 的做法,我们先考虑所有代价都没有被计算,然后接受一些代价以满足要求:一个点必须属于 \(S\)\(T\) 中。

注意到一个点 \(x\) 在白色的时候是没有单独的代价的,并且 \(id1\) 中的点和 \(id2\) 中的点是二分图的关系,我们可以对一个点 \(x\) 往源、汇点连的流量看成是染成黑色的代价。

然后考虑如何处理 "若 \(id1_i,id2_i\) 同时是黑色就有 \(1\) 的代价"。

因为我们割掉 \((S,x)\) 表示染黑,而同时染黑有代价就意味着在割掉 \((S,x),(y,T)\) 之后还要产生 \(1\) 的流量,那么对应着 \((y,x,1)\) 这样一条边。

为什么?

因为求的是最小割,那么我们割掉 \((S,x)\) 就是为了避免有流量流到 \(x\),而割掉 \((y,T)\) 就是为了避免有流量从 \(y\) 流到 \(T\),也就是 \(y\) 其实是有流量的,那么我们加上 \((y,x,1)\) 就一定会产生 \(1\) 的从 \(y\rightarrow x\) 的流量。

还有 "若 \(id1_i,id2_i\) 同时是黑色,或同时是白色就有 \(1\) 的代价",这其实只用在全黑的基础上加上全白的处理即可,因为两种选法一定不会同时计算。

那么全白就是连一条 \((id1_i,id2_i,1)\) 的边即可,表示 \(id1_i,id2_i\) 都没割掉的时候产生 \(1\) 的流量。

启发

  • 二分图最小割里的反向边 \((y,x,z)\) 的含义:

    \((S,x)\) 被割掉且 \((y,T)\) 被割掉的时候产生 \(z\) 的贡献。

posted @ 2022-07-27 19:50  qwq_123  阅读(20)  评论(0编辑  收藏  举报