有2n个士兵站成两排,他们需要被重新排列,以保证每一排里没有同样高的士兵——这样我们就说,士兵们被合理地安排了位置。 每次操作可以交换两个在同一位置(但不在同一排)的士兵。你的任务是用最少的操作来确保士兵们被合理地安排了位置。 例如: 有18个士兵站成两排,箭头标明了重新安排士兵位置的正确方式(图飞了?)。 写一个这样的程序: 读入n与士兵的身高,以及他们最初所站的位置,确保以最小的交换(站在同一位置的不同排的士兵)的次数来合理地安排士兵的位置,输出操作数。

Solution

我最菜了。

听一些dalao说要染色,于是我就有了一些NAIVE的想法,把每一列的两个点之间连一条边,既然每个点的度数最多为2,那么它最后一定是一堆环,我们要么全部正着走,要么都反着走,所以我们对每个联通块都做一遍就可以了。

Code

#include<iostream>
#include<cstdio>
#define N 100002
using namespace std;
int head[N],tot,a[N],b[N],ans,pos[],n,ma;
bool vis[N];
struct edge{
int n,to,tag;
}e[N<<];
inline void add(int u,int v,int tag){
e[++tot].n=head[u];
e[tot].to=v;
e[tot].tag=tag;
head[u]=tot;
}
void dfs(int u,int fa){
vis[u]=;
for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){
int v=e[i].to;
pos[e[i].tag]++;
if(!vis[v])dfs(v,u);
break;
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%d",&a[i]),ma=max(ma,a[i]);
for(int i=;i<=n;++i)scanf("%d",&b[i]),add(a[i],b[i],),add(b[i],a[i],),ma=max(ma,b[i]);
for(int i=;i<=ma;++i)if(!vis[i]){
pos[]=pos[]=;
dfs(i,);
ans+=min(pos[],pos[]); ;
}
cout<<ans;
return ;
}

获得了40pts

emmm

有一个问题就是说有些数会出现一次,因为每个点度数最多为2,不可能是基环树,只能是一条链,那么GG了。

我们把每列看成一个点,如果两列必须一样连0边,否则连1边,染色即可。

真·Code

#include<iostream>
#include<cstdio>
#define N 100002
using namespace std;
int head[N],tot,x,ans,pos[],n,pre[N],co[N];
bool vis[N];
struct edge{
int n,to,tag;
}e[N<<];
inline void add(int u,int v,int tag){
e[++tot].n=head[u];
e[tot].to=v;
e[tot].tag=tag;
head[u]=tot;
}
void dfs(int u,int c){
vis[u]=;pos[c]++;
for(int i=head[u];i;i=e[i].n)if(!vis[e[i].to]){
int v=e[i].to;
dfs(v,c^e[i].tag);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%d",&x);
if(pre[x]){
add(i,pre[x],);
add(pre[x],i,);
}
else pre[x]=i;
}
for(int i=;i<=n;++i){
scanf("%d",&x);
if(pre[x]){
add(i,pre[x],co[x]);
add(pre[x],i,co[x]);
}
else pre[x]=i,co[x]=;
}
for(int i=;i<=n;++i)if(!vis[i]){
pos[]=pos[]=;
dfs(i,);
ans+=min(pos[],pos[]);
}
cout<<ans;
return ;
}

[POI2005]DWU-Double-row的更多相关文章

  1. 转载 NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel

    我用的版本是1.25的.每个版本用法有一点不同 using System; using System.Collections.Generic; using System.ComponentModel; ...

  2. OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)

    在OpenCV2:图像的几何变换,平移.镜像.缩放.旋转(1)主要介绍了图像变换中的向前映射.向后映射.处理变换过程中浮点坐标像素值的插值算法,并且基于OpenCV2实现了两个简单的几何变换:平移和镜 ...

  3. 日志分析_使用shell完整日志分析案例

    一.需求分析 1. 日志文件每天生成一份(需要将日志文件定时上传至hdfs) 2. 分析日志文件中包含的字段:访问IP,访问时间,访问URL,访问状态,访问流量 3. 现在有"昨日" ...

  4. CDH5.4.5运行多字符分割记录

    准备工作: 测试文件内容:cis_cust_imp_info 20131131|+|100010001001|+|BR01|+|2000.0120131131|+|100010001002|+|BR0 ...

  5. C/C++二维数组分配内存

    //C++方式 double **Q=new double*[row];    //初始化Q矩阵 for(int i=0;i<row;++i) Q[i]=new double[POS_NUM]( ...

  6. IplImage, CvMat, Mat 的关系和相互转换(转)

    (看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重 ...

  7. IplImage, CvMat, Mat 的关系

    IplImage, CvMat, Mat 的关系 转载来源:http://www.cnblogs.com/summerRQ/articles/2406109.html opencv中常见的与图像操作有 ...

  8. Windows Azure Table storage 之 动态Table类 DynamicTableEntity

    在一般情况下,当我们在.net中使用Azure table storage的时候都会为该表建立一个TableEntity的派生类,如下所示. public class CustomerEntity : ...

  9. 使用 Hive 作为 ETL 或 ELT 工具

    用来处理数据的 ETL 和 ELT 工具的概述 数据集成和数据管理技术已存在很长一段时间.提取.转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库.现在,内存中转换 ETL 工具使得提取. ...

  10. six month dormancy test

    source data: accountleg    year_month    amount acc1A    2010-01    100 acc1A    2010-02    100 acc1 ...

随机推荐

  1. DDoS攻击、CC攻击的攻击方式和防御方法

    DDoS攻击.CC攻击的攻击方式和防御方法 - sochishun - 博客园https://www.cnblogs.com/sochishun/p/7081739.html cc攻击_百度百科htt ...

  2. 【Python3练习题 013】 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

    a=input('输入数字>>>') count=int(input('几个数字相加>>>')) ret=[] for i in range(1,count+1): ...

  3. Java8 Stream实例--统计出所有含‘张’字的人员的平均年龄

    package com.zhangxueliang.demo; import java.util.ArrayList; import java.util.List; import java.util. ...

  4. MyBatis映射文件1(增删改、insert获取自增主键值)

    增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...

  5. java中间缓存变量机制

    public static void main(String[] args){ int j = 0; for(int i = 0; i < 100; i++) j = j++; System.o ...

  6. 本地git连接远程github

    git要连接GitHub仓库,是通过SSH加密连接的,所以必须要创建SSH key ssh-key -t rsa -C "youremail@example.com" 这里邮箱必须 ...

  7. 微信小程序wxml無法實現頁面跳轉的問題

    wxml的 navigator的url設置后無法跳轉? 檢查要跳轉的頁面是否是在APP.json的tabBar里註冊過,如果是tabBar頁面是不能用wx.navigateTo和wx.Redirect ...

  8. easyui 自动动态合并单元格

    .......onLoadSuccess : function(data) { if (data.rows.length > 0) { //调用mergeCellsByField()合并单元格 ...

  9. 利用H5 FormData 实现表单中多图上传(可带其他如String类型数据)

    本篇的具体思路来源于右侧网址:http://blog.csdn.net/qq_19551571/article/details/49977983 本篇代码有所修改,请具体区分. 本篇使用的是 form ...

  10. BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队

    题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号 ...