BZOJ 1562 NOI2009 变换序列

1562: [NOI2009]变换序列

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 2070  Solved: 1047
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

5
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;
}

  

原文地址:https://www.cnblogs.com/something-for-nothing/p/7910499.html