1562: [NOI2009]变换序列
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 2070 Solved: 1047
[Submit][Status][Discuss]
Description
![](http://www.lydsy.com/JudgeOnline/images/1562_1.jpg)
Input
![](http://www.lydsy.com/JudgeOnline/images/1562_2.jpg)
Output
![](http://www.lydsy.com/JudgeOnline/images/1562_3.jpg)
Sample Input
5
1 1 2 2 1
1 1 2 2 1
Sample Output
1 2 4 0 3
HINT
30%的数据中N≤50;
60%的数据中N≤500;
100%的数据中N≤10000。
Source
简单的二分图匹配+一些小小的贪心
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int x=0;int f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=1e6+10;
struct node{
int y,next;
}e[MAXN];
int linkk[MAXN],len=0,n,m,a[MAXN],b[MAXN],d[MAXN],vis[10005],ans[MAXN],get[MAXN];
inline void insert(int xx,int yy){
e[++len].y=yy;e[len].next=linkk[xx];linkk[xx]=len;
}
inline int dis(int xx,int yy){
return min(abs(xx-yy),n-abs(xx-yy));
}
void init(){
n=read();
for(int i=0;i<n;i++){
d[i]=read();
}
for(int i=0;i<n;i++){
int x=i+d[i];
int y=i-d[i]+n;
x%=n;y%=n;
if(dis(x,i)!=d[i]) x=-1;
if(dis(y,i)!=d[i]) y=-1;
if(x<y) swap(x,y);
if(x!=-1) insert(i,x);
if(y!=-1) insert(i,y);
}
}
inline bool dfs(int st){
for(int i=linkk[st];i;i=e[i].next){
if(!vis[e[i].y]){
vis[e[i].y]=1;
if(!get[e[i].y]||dfs(get[e[i].y])){
get[e[i].y]=st;return 1;
}
}
}
return 0;
}
int main(){
//freopen("All.in","r",stdin);
//freopen("zhang.out","w",stdout);
init();
for(int i=n-1;i>=0;i--){
memset(vis,0,sizeof(vis));
if(!dfs(i)){
cout<<"No Answer"<<endl;
exit(0);
}
}
for(int i=0;i<n;i++){
ans[get[i]]=i;
}
printf("%d",ans[0]);
for(int i=1;i<n;i++){
printf(" %d",ans[i]);
}
return 0;
}