bzoj 1539: [POI2005]Dwu-Double-row
假设一列交换表示为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相关推荐
- bzoj 1539 [POI2005]Dwu-Double-row 建图+思路
题面 题目传送门 解法 思路还是比较精妙的 我们不妨假设a[i]a[i]a[i]表示iii这一列是否交换两行的数 然后对于一个数xxx,假设它出现的位置分别为第iii列和第jjj列,如果这两个位置在同 ...
- BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )
每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...
- bzoj 1535: [POI2005]Sza-Template(fail树)
1535: [POI2005]Sza-Template Time Limit: 5 Sec Memory Limit: 64 MB Submit: 372 Solved: 195 [Submit] ...
- 利用二维数组(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 ...
- 为什么要加上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 ...
- PCL:拟合平面直线和曲线以及空间曲线的原理到算法实现
使用两种思路进行直线拟合: 1.利用逆矩阵思想 --------------进行下列公式的推导需要理解逆矩阵(求A矩阵的逆矩阵,则A矩阵必须是方阵)的知识: (1)为什么要引入逆矩阵呢? 逆矩阵可以类 ...
- 如何优雅的导出 Excel
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5c6b6b126fb9a04 ...
- C#面向集合的扩展(讨论)
问题引出 C#是一种面向过程的算法设计语言,在处理数学计算时显得力不从心.面向集合是一种比较高阶的特性,允许程序直接对集合进行直接处理,而不用显示进行循环调用,不需要指定路径,因此可以大幅提高开发效率 ...
- Hello World on Impala
Cloudera Impala 官方教程 <Impala Tutorial>,解说了Impala一些基本操作,但操作步骤前后缺少连贯性,本文节W选<Impala Tutorial&g ...
最新文章
- ICML 2019接受论文:清华、北大领跑,谷歌强压枝头,BAT略显“低调”
- centos 7 lvs 负载均衡搭建部署
- 学好python需要什么基础-自学Python需要怎样的基础和准备
- 搭建XSS (跨网站指令码) 测试平台
- python单例模式数据库连接池_Python实现单例模式的四种方式
- SAP Spartacus Organization Unit List三个按钮的技术实现
- Go语言学习资料整理
- 2个linux机器怎么传文件(scp)
- elasticsearch 7.0.1 + kibana + elasticsearch-analysis-ik 7.0.0 安装和配置过程中问题备忘录...
- 现代书法脚本字体Tifany Script
- 明日之后登不上去一直连接服务器,《明日之后》登不上去怎么办 明日之后进不去怎么回事...
- FaceBook 遭遇有史以来全球最大宕机
- Verilog学习之路(1)— Quartus II 13.0下载安装和HelloWorld
- vue打开新html,vue在新窗口打开页面的方法
- java中事务回滚吗_事务回滚 - 小虾米的java梦 - 博客园
- 先正达谋定农化世界竞争格局-丰收节贸易会:座次重排
- Liteos-A任务调度之任务上下文切换
- Excel 2007版的常用功能(1):Excel基本操作
- M1 MacBook安装redis
- pythonsl火车加字_荐Python实现Radon变换——直接反投影和滤波反投影
热门文章
- 神一样的存在,河北衡水中学2019高考再次碾压所有中学
- ios 动画 隐藏tabbar_ios 开发怎么隐藏tabbar
- Unity 斜坡滑落
- android录音波浪动画_Android使用音频信息绘制动态波纹
- si,di,ds,es寄存器
- Java怎么屏蔽骂人的词_表示嫌弃一个人的词语-高级的含蓄的骂人的话-形容很反感一个人成语...
- 游戏测试——whistle抓包工具的使用
- 不小心格式化了硬盘怎么恢复?
- word中多级列表操作问题
- 计算机应用的多级列表是什么,Word2019中应用多级列表并更改级别的方法