1562: [NOI2009]变换序列
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 2070 Solved: 1047
[Submit][Status][Discuss]
Description
Input
Output
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; }