[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 ...
随机推荐
- vue keep-alive保存路由状态2 (高级用法,接上篇)
接上篇 https://www.cnblogs.com/wangmaoling/p/9803960.html 本文很长,请耐心看完分析. 4.高级用法,指定从什么组件进入才缓存,以及销毁缓存:先介绍我 ...
- Android eclipse 运行项目设置程序默认安装到SD卡
Android eclipse 运行项目设置程序默认安装到SD卡 1.在Android手机启用USB调试功能 2.在Windows系统中打开命令提示符(开始菜单,选择运行,输入cmd回车即可),使用 ...
- shell脚本执行的三种方式
(1) bash script_name 或 sh script_name 推荐使用此方法,script_name 不需要执行权限亦可执行. (2) path/script_name 或 ...
- 优动漫PAINT画树教程
依次解析画树要点!让画树不再是难事~ 优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597
- [LOJ2422]【NOIP2015】斗地主
大名鼎鼎的NOIP2015D1T3 题意: 由于一些众所周知的原因,没有完整题面…… 给你一副斗地主的手牌(牌数<=23),问最少要几次能出完: 包含双王,没有癞子,连对要三连对以上,可以直接出 ...
- NOIp2018模拟赛三十二
继续挂成傻逼 成绩:100+0+10(90)=110 A全场一眼题,C没取模挂八十分,然后没特判特殊情况又挂十分 A:[agc009b]tournament(太简单,咕了) B:[ATC2142]Bu ...
- POJ 3093 Margaritas on the River Walk(背包)
题意 n个有体积的物品,问选取一些物品,且不能再继续选有多少方法? n<=1000 题解 以前的考试题.当时是A了,但发现是数据水,POJ上WA了. 把体积从小到大排序枚举没选的物品中体积最小的 ...
- BZOJ 2938 [POI2000]病毒 (剪枝/A*迭代搜索)
LOJ BZOJ 题目大意:给你一些模式串,问是否存在一个无限长的文本串,不包含任何一个给定的模式串 并没有想到去模拟合法的文本串在模式串的Trie图上匹配的过程..我好菜啊 如果一个字符串合法,那么 ...
- 栈(stack)--c实现(使用双链表)
是不是直接贴代码不太好,我竟然不知道说什么. 写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的.好像应该去学习下画图,没图不 ...
- vue路由知识整理
vue路由知识整理 对于单页应用,官方提供了vue-router进行路由跳转的处理.我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(compo ...