[POI2005]DWU-Double-row(图论?)
题意
2n 个数站成两排(每个数在 2n个数中最多出现两遍),一次操作可以交换任意一列中两个数,求使每行数不重复的最少操作数。
(n<=50000)
题解
说实话,我真没想到图论。(我太菜了)
一开始以为是DP,写了一遍然后被自己的数据秒卡。
其实我已经发现选择的方案有依赖性,可是就是没想到图论。
假如一排中的i位置与j位置相等把i,j用权值为1的边连起来。
假如一排中i位置的数和另一排中j位置的数相等,把i,j用权值为0的边连起来。
然后要保证用1连起来的两点颜色不一样。用0连起的两个点颜色不一样进行黑白染色。
然后每一个联通块的最小数量的颜色之和就是答案。
(颜色相当于是否第i列换位置,显然1连的两点必须一个换一个不换,0连接的点要不全换,要不全不换)
(为什么不一样的用1连,一样的用0连,应为这样好染色,看代码)
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
const int N=;
map<int,int>ma,mb;
int col[N],vis[N],n,a[N],b[N],ans,head[N],cnt;
struct edge{
int to,nxt,w;
}e[N*];
void add(int u,int v,int w){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void bfs(int s){
queue<int> q;
q.push(s);
col[s]=;
vis[s]=;
int tot=;
int num=;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v])continue;
tot++;
q.push(v);
vis[v]=;
col[v]=col[u]^e[i].w;
if(col[v]==)num++;
}
}
ans+=min(num,tot-num);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(ma[a[i]]){
add(ma[a[i]],i,);
add(i,ma[a[i]],);
}
else ma[a[i]]=i;
}
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
if(ma[b[i]]){
add(ma[b[i]],i,);
add(i,ma[b[i]],);
}
else{
if(mb[b[i]]){
add(mb[b[i]],i,);
add(i,mb[b[i]],);
}
else mb[b[i]]=i;
}
}
for(int i=;i<=n;i++){
if(vis[i]==)bfs(i);
}
printf("%d",ans);
return ;
}
[POI2005]DWU-Double-row(图论?)的更多相关文章
- 转载 NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel
我用的版本是1.25的.每个版本用法有一点不同 using System; using System.Collections.Generic; using System.ComponentModel; ...
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
在OpenCV2:图像的几何变换,平移.镜像.缩放.旋转(1)主要介绍了图像变换中的向前映射.向后映射.处理变换过程中浮点坐标像素值的插值算法,并且基于OpenCV2实现了两个简单的几何变换:平移和镜 ...
- 日志分析_使用shell完整日志分析案例
一.需求分析 1. 日志文件每天生成一份(需要将日志文件定时上传至hdfs) 2. 分析日志文件中包含的字段:访问IP,访问时间,访问URL,访问状态,访问流量 3. 现在有"昨日" ...
- CDH5.4.5运行多字符分割记录
准备工作: 测试文件内容:cis_cust_imp_info 20131131|+|100010001001|+|BR01|+|2000.0120131131|+|100010001002|+|BR0 ...
- C/C++二维数组分配内存
//C++方式 double **Q=new double*[row]; //初始化Q矩阵 for(int i=0;i<row;++i) Q[i]=new double[POS_NUM]( ...
- IplImage, CvMat, Mat 的关系和相互转换(转)
(看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重 ...
- IplImage, CvMat, Mat 的关系
IplImage, CvMat, Mat 的关系 转载来源:http://www.cnblogs.com/summerRQ/articles/2406109.html opencv中常见的与图像操作有 ...
- Windows Azure Table storage 之 动态Table类 DynamicTableEntity
在一般情况下,当我们在.net中使用Azure table storage的时候都会为该表建立一个TableEntity的派生类,如下所示. public class CustomerEntity : ...
- 使用 Hive 作为 ETL 或 ELT 工具
用来处理数据的 ETL 和 ELT 工具的概述 数据集成和数据管理技术已存在很长一段时间.提取.转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库.现在,内存中转换 ETL 工具使得提取. ...
- six month dormancy test
source data: accountleg year_month amount acc1A 2010-01 100 acc1A 2010-02 100 acc1 ...
随机推荐
- BZOJ 1101 莫比乌斯函数+分块
思路: 题目中的gcd(x,y)=d (x<=a,y<=b)可以转化成 求:gcd(x,y)=1 (1<=x<=a/d 1<=y<=b/d) 设 G(x,y)表示x ...
- POJ 3299 模拟
水题,但是WA了一屏--- swap的时候忘了把读入的数字也swap了---------..[尴尬] // by SiriusRen #include <cmath> #include & ...
- Python的Flask框架入门-Ubuntu
全文请见tuts code:An Introduction to Python's Flask Framework Flask是Python一个小而强大的web框架.学起来简单,用起来也容易,能够帮你 ...
- 引用axiv文献的问题
首先找了一下对8种常见引用格式进行说明的文章 https://blog.csdn.net/wkd22775/article/details/51798927 然后就是水木社区大神们的记录http:// ...
- (转载) EditText初始不弹出软键盘,只有光标显示,点击再弹出
EditText初始不弹出软键盘,只有光标显示,点击再弹出 2013-06-08 10:13 21305人阅读 评论(5) 收藏 举报 分类: android基础(91) 版权声明:本文为博主原创 ...
- .NET深入解析LINQ框架1
1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 ( ...
- javascript满天小星星
- 垃圾回收器(GC)
值类型占用的空间在方法执行结束后会被马上释放, 引用类型占用的空间在方法结束后不会被马上释放,具体什么时间释放由垃圾回收器(GC)来决定. GC(Garbage Collection):JAVA/.N ...
- 15条JavaScript最佳实践【转】
本文档整理大部分公认的.或者少有争议的JavaScript良好书写规范(Best Practice).一些显而易见的常识就不再论述(比如要用对象支持识别判断,而不是浏览器识别判断:比如不要嵌套太深). ...
- maven 安装jar包
1 下载maven: 下载路径: http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-b ...