假设一列交换表示为1,不换表示为0.

  身高相同的两个人相当于给其中两列了一个限制条件,要么是两个必须相等,要么一个为零一个为一。

  有了关系后我们就可以把每列当成一个点建边,边权为0表示必须相同,1为必须不同,这样每个联通块会被分为两个确定的集合,把$size$小的交换就行了。

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 100005
 6 using namespace std;
 7 int n;
 8 int cnt[2];
 9 int v[N],vis[N];
10 int be[N],pos[N];
11 int head[N],ver[N],nxt[N],tot,quan[N];
12 void add(int a,int b,int c)
13 {
14     tot++;nxt[tot]=head[a];head[a]=tot;quan[tot]=c;ver[tot]=b;return ;
15 }
16 void dfs(int x,int b)
17 {
18     vis[x]=1;cnt[b]++;
19     for(int i=head[x];i;i=nxt[i])
20     {
21         if(!vis[ver[i]])
22         {
23             dfs(ver[i],(b+quan[i])&1);
24         }
25     }
26     return ;
27 }
28 int main()
29 {
30     scanf("%d",&n);
31     for(int i=1;i<=n;i++)
32     {
33         int tmp;
34         scanf("%d",&tmp);
35         if(be[tmp])
36         {
37             add(be[tmp],i,1);
38             add(i,be[tmp],1);
39         }
40         else be[tmp]=i,pos[tmp]=1;
41     }
42     for(int i=1;i<=n;i++)
43     {
44         int tmp;
45         scanf("%d",&tmp);
46         if(be[tmp])
47         {
48             if(pos[tmp]==1)
49             {
50                 add(be[tmp],i,0);
51                 add(i,be[tmp],0);
52             }
53             else
54             {
55                 add(be[tmp],i,1);
56                 add(i,be[tmp],1);
57             }
58         }
59         else be[tmp]=i,pos[tmp]=2;
60     }
61     int ans=0;
62     for(int i=1;i<=n;i++)
63     {
64         if(!vis[i])
65         {
66             cnt[0]=cnt[1]=0;
67             dfs(i,0);
68             ans+=min(cnt[0],cnt[1]);
69         }
70     }
71     printf("%d\n",ans);
72     return 0;
73 }

  

转载于:https://www.cnblogs.com/ezyzy/p/6538927.html

bzoj 1539: [POI2005]Dwu-Double-row相关推荐

  1. bzoj 1539 [POI2005]Dwu-Double-row 建图+思路

    题面 题目传送门 解法 思路还是比较精妙的 我们不妨假设a[i]a[i]a[i]表示iii这一列是否交换两行的数 然后对于一个数xxx,假设它出现的位置分别为第iii列和第jjj列,如果这两个位置在同 ...

  2. BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )

    每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...

  3. bzoj 1535: [POI2005]Sza-Template(fail树)

    1535: [POI2005]Sza-Template Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 372  Solved: 195 [Submit] ...

  4. 利用二维数组(double[])实现一个矩阵类:Matrix。要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为valu

    利用二维数组(double[])实现一个矩阵类:Matrix.要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为valu ...

  5. 为什么要加上ROW FORMAT DELIMITED NULL DEFINED AS ‘‘;?

    create table if not exists db_app.app_pageview_rate(daystr string,step string,numb int,rate double,r ...

  6. PCL:拟合平面直线和曲线以及空间曲线的原理到算法实现

    使用两种思路进行直线拟合: 1.利用逆矩阵思想 --------------进行下列公式的推导需要理解逆矩阵(求A矩阵的逆矩阵,则A矩阵必须是方阵)的知识: (1)为什么要引入逆矩阵呢? 逆矩阵可以类 ...

  7. 如何优雅的导出 Excel

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5c6b6b126fb9a04 ...

  8. C#面向集合的扩展(讨论)

    问题引出 C#是一种面向过程的算法设计语言,在处理数学计算时显得力不从心.面向集合是一种比较高阶的特性,允许程序直接对集合进行直接处理,而不用显示进行循环调用,不需要指定路径,因此可以大幅提高开发效率 ...

  9. Hello World on Impala

    Cloudera Impala 官方教程 <Impala Tutorial>,解说了Impala一些基本操作,但操作步骤前后缺少连贯性,本文节W选<Impala Tutorial&g ...

最新文章

  1. ICML 2019接受论文:清华、北大领跑,谷歌强压枝头,BAT略显“低调”
  2. centos 7 lvs 负载均衡搭建部署
  3. 学好python需要什么基础-自学Python需要怎样的基础和准备
  4. 搭建XSS (跨网站指令码) 测试平台
  5. python单例模式数据库连接池_Python实现单例模式的四种方式
  6. SAP Spartacus Organization Unit List三个按钮的技术实现
  7. Go语言学习资料整理
  8. 2个linux机器怎么传文件(scp)
  9. elasticsearch 7.0.1 + kibana + elasticsearch-analysis-ik 7.0.0 安装和配置过程中问题备忘录...
  10. 现代书法脚本字体Tifany Script
  11. 明日之后登不上去一直连接服务器,《明日之后》登不上去怎么办 明日之后进不去怎么回事...
  12. FaceBook 遭遇有史以来全球最大宕机
  13. Verilog学习之路(1)— Quartus II 13.0下载安装和HelloWorld
  14. vue打开新html,vue在新窗口打开页面的方法
  15. java中事务回滚吗_事务回滚 - 小虾米的java梦 - 博客园
  16. 先正达谋定农化世界竞争格局-丰收节贸易会:座次重排
  17. Liteos-A任务调度之任务上下文切换
  18. Excel 2007版的常用功能(1):Excel基本操作
  19. M1 MacBook安装redis
  20. pythonsl火车加字_荐Python实现Radon变换——直接反投影和滤波反投影

热门文章

  1. 神一样的存在,河北衡水中学2019高考再次碾压所有中学
  2. ios 动画 隐藏tabbar_ios 开发怎么隐藏tabbar
  3. Unity 斜坡滑落
  4. android录音波浪动画_Android使用音频信息绘制动态波纹
  5. si,di,ds,es寄存器
  6. Java怎么屏蔽骂人的词_表示嫌弃一个人的词语-高级的含蓄的骂人的话-形容很反感一个人成语...
  7. 游戏测试——whistle抓包工具的使用
  8. 不小心格式化了硬盘怎么恢复?
  9. word中多级列表操作问题
  10. 计算机应用的多级列表是什么,Word2019中应用多级列表并更改级别的方法