题目链接


题目大意:

给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B.
要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi
最大化Ai≠BiAi≠BiAi​=Bi的下标iii数量


1e5我都不敢相信这也可以用网络流!!!
这道题看起来无从下手那么我们就分类讨论来看一下
但是发现直接讨论Ai≠BiA_i≠B_iAi​​=Bi​很麻烦,那么问题先变成球最小化Ai=BiA_i=B_iAi​=Bi​再用nnn减掉就好了

  1. Pi=Qi=iP_i=Q_i=iPi​=Qi​=i 这个时候无论你选什么Ai一定是等于BiA_i一定是等于B_iAi​一定是等于Bi​
  2. Pi=i&&Qi≠iP_i=i\&\&Q_i≠iPi​=i&&Qi​​=i 那么如果Oi=iO_i=iOi​=i的话那么这里就会有1个的相等的位置
  3. Qi=1&&Pi≠iQ_i=1\&\&P_i≠iQi​=1&&Pi​​=i 那么如果这里Pi=iP_i=iPi​=i的话那么这里就会有1个相等的位置
  4. Qi≠Pi≠iQ_i≠P_i≠iQi​​=Pi​​=i 那么只有Pi=Qi=iP_i=Q_i=iPi​=Qi​=i的时候才会有一个相等的位置
  5. Qi=PI≠iQ_i=P_I≠iQi​=PI​​=i那么只要取Pi和QiP_i和Q_iPi​和Qi​ 或者都取iii的时候那么就是有1个相等的位置

但是有一点就是因为Ai和BiA_i和B_iAi​和Bi​也是全排列!!
注意原题的排列是从0开始的,为讨论方便,我们统一转化为从1开始的。
考虑对于每个排列,把i向Pi连边,那么就会形成很多个环。比如排列3,2,4,1{3,2,4,1}3,2,4,1,其中3,4,1和2分别形成两个环1−3−4−1和2−2。我们令Ai=PiA_i=P_iAi​=Pi​,实际上就是把环上的数Pi选转过来(当然理解成把i转过来也可以,只是环上点权设置的问题).。对于一个环,环上的点选择的方案应该是一致的(全都等于i或全都不等于i),否则就会存在某个数不合法


现在我们令两个集合S,TS,TS,T。
对于PPP数组中的第iii个数PiP_iPi​如果放入S集合里面相当于AiA_iAi​选PiP_iPi​,放入T集合相当于AiA_iAi​选iii
对于QQQ数组就反过来,如果放入S集合里面相当于BiB_iBi​选iii,放入T集合相当于BiB_iBi​选QiQ_iQi​


那么上面的问题就可以转化了
因为是求最小化的位置相同个数!
那么就是最小割,对于每条边我们都赋予割了它的实际意义,那么满足的最小化就是最小割了!!


因为对于同一个轮换里面的位置选的都是一样的那么我们直接用轮换的下标去代替就好了

  1. Pi=Qi=iP_i=Q_i=iPi​=Qi​=i 这个时候无论你选什么Ai一定是等于BiA_i一定是等于B_iAi​一定是等于Bi​ ans 直接减1
  2. Pi=i&&Qi≠iP_i=i\&\&Q_i≠iPi​=i&&Qi​​=i 那么如果Qi=iQ_i=iQi​=i的话那么这里就会有1个的相等的位置,那么就是QiQ_iQi​放到S集合里面代价是1,反过来放在T集合就是代价就是0;
  3. Qi=1&&Pi≠iQ_i=1\&\&P_i≠iQi​=1&&Pi​​=i 那么如果这里Pi=iP_i=iPi​=i的话那么这里就会有1个相等的位置,同理!
  4. Qi=PI≠iQ_i=P_I≠iQi​=PI​​=i那么只要取Pi和QiP_i和Q_iPi​和Qi​ 或者都取iii的时候那么就是有1个相等的位置,那么按照上的集合划分就是在如果Pi和QiP_i和Q_iPi​和Qi​在不同的集合里面代价为1.
  5. Qi≠Pi≠iQ_i≠P_i≠iQi​​=Pi​​=i 那么只有Pi=Qi=iP_i=Q_i=iPi​=Qi​=i的时候才会有一个相等的位置,那么就是PiP_iPi​在S集合里面,QiQ_iQi​在T集合里面

那么就参考集合冲突模型的建图模型

  1. 直接建图就可以了!!
  2. Qi−>T流量为1Q_i->T流量为1Qi​−>T流量为1 S−>Pi流量为0S->P_i流量为0S−>Pi​流量为0
  3. Qi−>T流量为0Q_i->T流量为0Qi​−>T流量为0 S−>Pi流量为1S->P_i流量为1S−>Pi​流量为1
  4. Pi−>Qi流量为1P_i->Q_i流量为1Pi​−>Qi​流量为1 Qi−>Pi流量为1Q_i->P_i流量为1Qi​−>Pi​流量为1
  5. Qi−>Pi流量为1Q_i->P_i流量为1Qi​−>Pi​流量为1

代码:

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = N;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)  {read(first);read(args...);
}
struct node {int to, next, len;
}e[maxn];
int head[maxn], cnt;
int n, m, s, t;
inline void add(int from, int to, int len) {e[cnt] = {to,head[from],len};head[from] = cnt ++;
}int d[maxn],cur[maxn];
int pre[maxn], flow[maxn];bool bfs() {ms(d,0);queue<int> q;q.push(s); d[s] = 1;while(!q.empty()) {int u = q.front(); q.pop();for(int i = head[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[v] || e[i].len <= 0) continue;q.push(v);d[v] = d[u] + 1;}}      for(int i = 0; i <= n; ++ i) cur[i] = head[i];return d[t] != 0;
}int dfs(int u, int flow) {if(u == t) return flow;for(int &i = cur[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[u] + 1 != d[v] || e[i].len <= 0) continue;int delta = dfs(v,min(flow,e[i].len));if(delta <= 0) continue;e[i].len -= delta;e[i^1].len += delta;return delta;}return 0;
}int get_maxflow() {int maxFlow = 0, delta;while(bfs())//bfs进行构建最短路网络while(delta = dfs(s,INF))maxFlow += delta;return maxFlow;
}
int P[maxn], Q[maxn];
int Cle;//统计环的个数
int idp[maxn]; // p数组中每个数在哪个环里面
int idq[maxn]; // q数组中每个数在哪个
int main() {IOS;ms(head,-1);int tn;cin >> tn;for(int i = 1; i <= tn; ++ i)cin >> P[i], P[i] ++;for(int i = 1; i <= tn; ++ i)cin >> Q[i], Q[i] ++;for(int i = 1; i <= tn; ++ i) {if(idp[i]) continue;Cle ++;int idx = i;do {idp[idx] = Cle;idx = P[idx];}while(idx != i);}for(int i = 1; i <= tn; ++ i) {if(idq[i]) continue;Cle ++;int idx = i;do {idq[idx] = Cle;idx = Q[idx]; }while(idx != i);}int ans = tn;s = 0, t = Cle+1;n = 2*tn+1;for(int i = 1; i <= tn; ++ i) {if(P[i] == i && Q[i] == i) ans --;else if(P[i] == i) {add(idq[i],t,1);add(t,idq[i],0);//可有可不有add(s,idq[i],0);add(idq[i],s,0);} else if(Q[i] == i) {add(s,idp[i],1);add(idp[i],s,0);//可有可不有add(idp[i],t,0);add(t,idp[i],0);} else if(Q[i] == P[i]) {add(idp[i],idq[i],1);add(idq[i],idp[i],0);add(idq[i],idp[i],1);add(idp[i],idq[i],0);} else {add(idq[i],idp[i],1);add(idp[i],idq[i],0);}}cout << ans - get_maxflow();return 0;
}

最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]相关推荐

  1. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  2. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

  3. 【深度学习】扩散模型(Diffusion Model)详解

    [深度学习]扩散模型(Diffusion Model)详解 文章目录 [深度学习]扩散模型(Diffusion Model)详解 1. 介绍 2. 具体方法 2.1 扩散过程 2.2 逆扩散过程 2. ...

  4. Meta最新模型LLaMA细节与代码详解

    Meta最新模型LLaMA细节与代码详解 0. 简介 1. 项目环境依赖 2. 模型细节 2.1 RMS Pre-Norm 2.2 SwiGLU激活函数 2.3 RoPE旋转位置编码 3. 代码解读 ...

  5. OSI 七层模型和TCP/IP模型及对应协议(详解)

    OSI 七层模型和TCP/IP模型及对应协议(详解) 查看全文 http://www.taodudu.cc/news/show-6185847.html 相关文章: OSI7层网络模型协议精析 OSI ...

  6. Tensorflow 2.x(keras)源码详解之第十章:keras中的模型保存与加载(详解Checkpointmd5模型序列化)

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  7. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  8. tensorflow打印模型结构_社区分享 | 详解 TensorFlow 中 Placement 的最后一道防线 — Placer 算法...

    本文作者王思宇,阿里巴巴算法专家,从事深度学习算法平台建设,TensorFlow 分布式架构设计与大规模分布式性能优化工作,开源 TensorFlow 项目 contributor. 本文转自:互联网 ...

  9. java模型给泛型_java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应 ...

最新文章

  1. 七牛云内容审核服务被选为「上海首批人工智能创新产品」
  2. python numpy库作用_python Numpy库
  3. Ubuntu中用gedit保存文件失败的解决办法
  4. STL源码剖析 内存基本处理工具 初始化空间的五个函数
  5. MySQL InnoDB count()函数
  6. 实战weblogic集群之创建节点和集群
  7. 京东回应「被薅 7000 万、项目组全体开除」;微信朋友圈屏蔽支付宝集五福;MySQL 8.0.19 发布 | 极客头条...
  8. [Win/Mac]下载工具推荐及使用
  9. FPGA基础知识21(PL控制PS端DDR的设计)
  10. deepin深度系统下安装QQ音乐
  11. Robot Framework自动化测试用具 Wait Until Keyword Succeeds关键字使用案例
  12. C语言---1 C语言认知
  13. java 弹幕 原理_Flutter 实现虎牙/斗鱼 弹幕效果
  14. 015:苹果和虫子2
  15. Mac brew update手顺
  16. 微型计算机的一般工作过程,微型计算机的基本工作原理
  17. 丰胸的贴吧怎样引流加微信?百度贴吧怎么才能把人引流到微信?
  18. Python学习笔记(2)-基础语法
  19. 手柄映射软件_生化危机3该用哪款游戏手柄?北通宙斯给你四维游戏体验
  20. 任何一台计算机都可以安装win 7系统,任何电脑都能用U盘装64位win7么?

热门文章

  1. 最全综述 | 图像目标检测
  2. 人人必须要知道的语义分割模型:DeepLabv3+
  3. 自动驾驶规划方法综述
  4. 计算机视觉不可能凉!
  5. 4个计算机视觉领域用作迁移学习的模型
  6. 基于OpenCV的焊件缺陷检测
  7. Python-ORM实战
  8. JSX设置CSS样式详解
  9. (二) 关于配置travis-ci持续集成python pytest测试的相关记录
  10. 2015-08-07get方式/post方式