【问题描述】

       对于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
 
倒序二分图匹配,使用vector容器省空间省时间。
 
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
int n;
int dis[];
int lin[];
int ans[];
bool f[];
vector<int>a[]; int flag(int q,int p)
{
return min(abs(q-p),n-abs(q-p));
} bool dfs(int x)
{
int l=a[x].size();
for(int i=;i<l;++i)
{
if(!f[a[x][i]])
{
f[a[x][i]]=;
if(lin[a[x][i]]==-||dfs(lin[a[x][i]]))
{
lin[a[x][i]]=x;
return true;
}
}
}
return false;
} int main()
{
//freopen("a.txt","r",stdin);
//freopen("b.txt","w",stdout);
//freopen("transform.in","r",stdin);
//freopen("transform.out","w",stdout);
memset(a,,sizeof(a));
cin>>n;
for(int i=;i<n;++i)
scanf("%d",&dis[i]);
for(int i=;i<n;++i)
{
int x=i+dis[i];
int y=i+n-dis[i];
x%=n;y%=n;
if(flag(x,i)!=dis[i]) x=-;
if(flag(y,i)!=dis[i]) y=-;
if(x>y) swap(x,y);
if(x!=-) a[i].push_back(x);
if(y!=-) a[i].push_back(y);
} memset(lin,-,sizeof(lin));
for(int i=n-;i>=;--i)
{
memset(f,,sizeof(f));
if(!dfs(i))
{
cout<<"No Answer"<<endl;
return ;
}
} //cout<<123456<<endl;
for(int i=;i<n;++i)
ans[lin[i]]=i;
for(int i=;i<n-;++i)
printf("%d ",ans[i]);
cout<<ans[n-]<<endl;
return ;
}

【BZOJ1562】【jzyzOJ1730】【COGS409】NOI2009变换序列 二分图匹配的更多相关文章

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

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

  2. 【bzoj1562】【[NOI2009]变换序列】匈牙利算法的性质利用

    (上不了p站我要死了,侵权度娘背锅) Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30 ...

  3. BZOJ1562: [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≤ ...

  4. BZOJ 1562 变换序列(二分图匹配)

    显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...

  5. BZOJ 1562 变换序列 二分图匹配+字典序

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...

  6. Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  7. BZOJ 1562 [NOI2009] 变换序列

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

  8. [Luogu 1963] NOI2009 变换序列

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

  9. noi2009变换序列

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

随机推荐

  1. optparser 模块 提取IP,端口,用户名,密码参数模板

    import optparse #class FtpClient(object): #自定义类可以自己修改 '''ftp客户端''' #def __init__(self): parser = opt ...

  2. Python 技巧(三)—— list 删除一个元素的三种做法

    我们以一个字符串为元素类型的 list 为例,进行列表元素的删除: >>> l = ['no surfing', 'flippers'] 1 法一:remove(val) >& ...

  3. 3 View视图 URLconf

    1.视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图: 2 准 ...

  4. Java-数据结构之栈练习

    栈(stack)可以看做是特殊类型的线性表,访问.插入和删除其中的元素只能在栈尾(栈顶)进行. 队列(queue)表示一个等待的线性表,它也可以看做是一种特殊类型的线性表,元素只能从队列的末端(队列尾 ...

  5. luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree

    k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...

  6. Fragment 和 Activity 之间通信

    在 Activity 中获取 Fragment 实例: FragmentManager 提供了一个类似于 findViewById 的方法,专门用于从布局文件中获取 Fragment 实例: //通过 ...

  7. 【Set Matrix Zeros】cpp

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. cl ...

  8. leetcode 【 Trapping Rain Water 】python 实现

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  9. 【NOIP 2012】借教室

    题目 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望 ...

  10. BugKu-妹子的陌陌

    打开后看这张图片,先放winhex里面,文件头FFD8,是jpg图片.看文件尾并不是FFD9,所以binwalk分析一下. 发现有一个rar文件,然后用foremost分离.发现里面有个加密的rar文 ...