题目: http://cojs.tk/cogs/problem/problem.php?pid=409

409. [NOI2009]变换序列

★★☆   输入文件:transform.in   输出文件:transform.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】

       对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中
定义xy之间的距离。给定每个iTi之间的距离D(i,Ti),
你需要求出一个满足要求的变换序列T。如果有多个满足条件的序列,输出其中字典序最小的一个。
 
说明:对于两个变换序列ST,如果存在p<N,满足对于i=0,1,……p-1,Si=TiSp<Tp,我们称ST字典序小。
【输入文件】
       输入文件transform.in的第一行包含一个整数N,表示序列的长度。接下来的一行包含N个整数Di,其中Di表示iTi之间的距离。
【输出文件】
       输出文件为transform.out。
如果至少存在一个满足要求的变换序列T,则输出文件中包含一行N个整数,表示你计算得到的字典序最小的T;否则输出”No Answer”(不含引号)。注意:输出文件中相邻两个数之间用一个空格分开,行末不包含多余空格。
【输入样例】
5
1 1 2 2 1
【输出样例】
1 2 4 0 3
【数据规模和约定】
20%的数据中N≤50;
60%的数据中N≤500;
100%的数据中N≤10000。
 
题解:
二分图匹配+匈牙利算法
设原序列值为x[0],x[1],x[2]......x[n-1],要变成的序列值为y[0],y[1],y[2]......y[n-1].
原序列也就是0,1,2......n-1,即x[0]=0,x[1]=1,x[2]=2......x[n-1]=n-1.
首先,通过样例可以想到每一个值x[i]可以变成的 y[i]的取值最多只有两个,但为什么,证明如下:
 
设a=| x[i] - y[i] |,且a ≤ (n-a),其中a,(n-a)都为差值(由题目中可知)
 
对于每一个x[i],我们有y[i]=x[i]±a或y[i]=x[i]±(n-a).
 
因为每个x[i]和y[i]要满足0≤x[i]≤n-1,0≤y[i]≤n-1,且y[i]=x[i]±a或y[i]=x[i]±(n-a).
 
则可以得到:  x[i]+a≤n-1   --------------   (1)式
                   x[i]-a≥0       --------------   (2)式
                   x[i]+(n-a)≤n-1  ----------    (3)式
                   x[i]-(n-a)≥0   -------------   (4)式
 
(3)式化简可得 : x[i]-a≤-1
 
(4)式移项可得 : x[i]+a≥n
 
观察四个式子,我们可以发现 :(1)式 和 (4)式 是矛盾的,(2)式 和(3)式 是矛盾的.
 
所以,我们只能在 (1)式 和 (4)式 中选一个,(2)式 和(3)式 中选一个.
 
证毕.
 
然后,有了这个结论,我们就把题目变成了 :给出0...n-1,还给出了每个数的变化量(变化量给的是绝对值,也就是可以变化的差值),每个数都必须要 变化 且 恰好变化给定的差值 ,每个数可以变成两个数(上面已经证明),让你 变成0...n-1 且 使变后的序列 字典序 最小。
就可以跑匈牙利了(迷之时间复杂度。。。)
其实就是要判断是否 完美匹配 。若没有 完美匹配 ,则输出无解。
注意匈牙利要倒着跑,可以跑出 字典序 最小。
 #include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
int BF[MAXN],BF1[MAXN],d[MAXN],prey[MAXN],n,f[MAXN][];
//bool f[MAXN][MAXN];
bitset<MAXN> vis;
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
int Xyl(int u)
{
int i,v;
for(i=;i<=;i++)
{
v=f[u][i];
if(vis[v]==)
{
vis[v]=;
if(Xyl(BF[v])==||BF[v]==)
{
BF[v]=u;
BF1[u]=v;
return ;
}
}
}
return ;
}
int main()
{
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
int i,ans,dd,gs;
n=read();
memset(f,false,sizeof(f));
for(i=;i<n;i++)
{
d[i]=read();dd=n-d[i];
gs=-;
if(i-d[i]>=)f[i][++gs]=i-d[i];
if(i+d[i]<=n-)f[i][++gs]=i+d[i];
if(i-dd>=)f[i][++gs]=i-dd;
if(i+dd<=n-)f[i][++gs]=i+dd;
if(f[i][]>=f[i][])swap(f[i][],f[i][]);
}
memset(BF,,sizeof(BF));ans=;
memset(prey,-,sizeof(prey));
for(i=n-;i>=;i--)
{
vis.reset();
ans+=Xyl(i);
//prey[i]=BF1[i];
}
if(ans!=n)printf("No Answer");
else
{
//for(i=0;i<n;i++)BF1[BF[i]]=i;
for(i=;i<n;i++)printf("%d ",BF1[i]);
}
fclose(stdin);
fclose(stdout);
return ;
}

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配的更多相关文章

  1. BZOJ 1562 [NOI2009] 变换序列

    [NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...

  2. BZOJ 1562 [NOI2009]变换序列:二分图匹配

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题意: 给定n,定义D(x,y) =  min(|x-y|, n-|x-y|),然后 ...

  3. 1562: [NOI2009]变换序列 - BZOJ

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  4. 1562. [NOI2009]变换序列【二分图】

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50: 60%的数据中N ...

  5. Luogu P1963 [NOI2009]变换序列(二分图匹配)

    P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...

  6. [模板] 匈牙利算法&&二分图最小字典序匹配

    匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...

  7. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  8. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

  9. # 匈牙利算法(二分图最大匹配)- hdu 过山车

    匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...

随机推荐

  1. cx_Oracle ORA-24315: 非法的属性类型的解决办法

    网上查找原因说: 出现该错误的原因是因为版本不兼容. 检查了一下python版本和oracle 的版本,我的oracle client是10g的,python的版本是2.7, 但我安装的cx_orac ...

  2. django 的请求处理部分----WSGIHandler 源码分析 django1.5.5

    从这里拉开django框架的帷幕..撕开,哈哈 主要涉及的类:django.core.handlers.base.BaseHandler,django.core.handlers.wsgi.WSGIH ...

  3. 一步步学习NHibernate(2)——配置NHibernate的环境

    请注明转载地址:http://www.cnblogs.com/arhat 第二章 环境搭建 在上一章中,我们知道了NHibernate是用来干什么的了,那么今天在本章中,我们开始搭建NHibernat ...

  4. Hyper-V中安装CentOS分辨率修改

    Hyper-V还是极好用的,不过对linux的支持优点问题, 比如默认情况,linux分辨率被锁定了,这里有一个比较简单的方法修改,针对CentOS grubby --update-kernel=AL ...

  5. oct(x) 将一个数字转化为8进制

    >>> a = 12 >>> b 21 >>> c = oct(a) >>> d = oct(b) >>> c ...

  6. Spring mvc 学习笔记

    记录下学习spring-mvc的技术要点,项目结构路径如下: 1. 首先要在web.xml中添加Servlet和filter的配置: <!-- 转码,防止乱码--> <filter& ...

  7. ANDROID_MARS学习笔记_S01原始版_009_SQLite

    一.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> <L ...

  8. [Android] 修改设备访问权限

    在硬件抽象层模块中,我们是调用open函数来打开对应的设备文件的.例如,在2.3.2小节中开发的硬件抽象层模块freg中,函数freg_device_open调用open函数来打开设备文件/dev/f ...

  9. c#桥接模式(bridge结构模式)

    桥接模式(bridge结构模式)c#简单例子 在前面的玩家中每增加一个行为,就必须在每个玩家中都增加,通过桥接模式将行为提取出来了,减少变化 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  10. BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1778 炸弹从1出发,有\(\frac{P}{Q}\)的概率爆炸,如果不爆炸,等概率移动到连通的 ...