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

      

  • 相关阅读:
    局域网中电脑之间无法ping通问题
    Python 字典dict操作定义
    set集合
    Python 元组遍历排序操作方法
    Python List 列表list()方法
    set函数&操作
    dict函数
    文件操作
    list函数
    字符串格式化format使用
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7910499.html
Copyright © 2020-2023  润新知