【NOIP2016提高A组模拟7.21】Double-row
2017-07-04 20:25
351 查看
Description
科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个。但他写完后觉得看起来有点不和谐。他希望重新编排,使得每一行数中没有相同的数。
他每次可以调换同一列的两个数。
请帮他找到操作次数最少的方案。
Input
第一行一个正整数N,代表每一行数的个数。第二第三行每行N个数,代表第一行与第二行的数值。
Output
第一行一个整数,表示最少的操作次数。数据保证合法的操作是存在的。Sample Input
92 5 5 2 7 4 7 3 9
1 6 8 4 6 3 9 1 8
Sample Output
3Data Constraint
设字符串的长度为N。Subtask1[30pts]:N<=500
Subtask2[30pts]:N<=5000
Subtask3[40pts]:N<=50000
数值Xi满足1<=X<=100000
Solution
这题的方法比较巧妙可以发现,每个数字最多只能出现两次,否则就会无解
如果两个数字出在同一行,那么这两列必须且仅能交换一列
如果两个数字出现在不同行,那么这两列要么同时换,要么同时不换
把每一列的两个数字看成一个点,分别以上述两种方式连两种边,这样会形成一堆联通块,每个联通块之间相互独立互不影响。
对于每个联通块,选定一个点,让它交换或不交换,那么可以通过一个点得知整个联通块需要交换的点的个数,这不是答案,答案还可能是在这种情况下交换的点不交换,不交换的点交换,所以还要取个min
Code
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define N 101000 using namespace std; int t[2] [2],ans=0,n,last ,next[N*10],to[N*10],date[N*10],tot=0,bz ,an,na; void put(int x,int y,int z) { next[++tot]=last[x];last[x]=tot;to[tot]=y;date[tot]=z; next[++tot]=last[y];last[y]=tot;to[tot]=x;date[tot]=z; } void dg(int x,int z) { na++;bz[x]=z;if(z==1) an++; for(int i=last[x];i;i=next[i]) if(bz[to[i]]==-1) { if(date[i]==0) dg(to[i],1-z); else dg(to[i],z); } } int main() { scanf("%d",&n); memset(bz,255,sizeof(bz)); fo(i,1,n) { int x;scanf("%d",&x); if(t[0][x][0]==0) t[0][x][0]=i;else t[0][x][1]=i; } fo(i,1,n) { int x;scanf("%d",&x); if(t[1][x][0]==0) t[1][x][0]=i;else t[1][x][1]=i; } fo(x,1,100000) if(t[0][x][0]||t[1][x][0]) { if(t[0][x][0]) { if(t[0][x][1]) put(t[0][x][0],t[0][x][1],0); else if(t[1][x][0]) put(t[0][x][0],t[1][x][0],1); } else if(t[1][x][0]) { if(t[1][x][1]) put(t[1][x][0],t[1][x][1],0); } } fo(i,1,n) if(bz[i]==-1) { an=na=0; dg(i,0); ans+=min(an,na-an); } printf("%d",ans); }
相关文章推荐
- JZOJ4675. 【NOIP2016提高A组模拟7.21】Double-row
- JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row
- 【NOIP2016提高A组模拟7.21】Clock Sequence
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
- JZOJ4676. 【NOIP2016提高A组模拟7.21】模板串
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
- 【NOIP2016提高A组模拟8.15】Password
- [jzoj4711]【NOIP2016提高A组模拟8.17】Binary
- JZOJ 4711 Binary【NOIP2016提高A组模拟8.17】
- Binary 【NOIP2016提高A组模拟8.17】
- [JZOJ 4714]【NOIP2016提高A组模拟8.19】公约数
- 【NOIP2016提高A组模拟10.15】算循环
- JZOJ 4628 立方体【NOIP2016提高A组模拟7.15】
- 【NOIP2016提高A组模拟9.2】积木
- 【NOIP2016提高A组模拟7.17】锦标赛
- Graph Coloring【NOIP2016提高A组模拟7.20】
- 【NOIP2016提高A组模拟9.7】总结
- 【JZOJ4756】【NOIP2016提高A组模拟9.4】幻象
- 【NOIP2016提高A组模拟9.9】总结