• noi 2009 变换序列 贪心


    题意:

     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<set>
     5 #include<cstdio>
     6 using namespace std;
     7 #define MAXN 20000
     8 int n;
     9 int l,r;
    10 int ans[MAXN];
    11 bool use[MAXN];
    12 pair<int,int> part[MAXN];
    13 int a[MAXN];
    14 set<int> opt[MAXN];
    15 int Q[MAXN];
    16 bool bfs(int left,int right)
    17 {
    18     set<int>::iterator te,p;
    19     while(left<=right)
    20     {
    21         int x=Q[left++];
    22         use[x]=1;
    23         te=opt[x].begin();
    24         int y=*te;
    25         if(ans[*te]!=-1)
    26         {
    27             printf("No Answer\n");
    28             return 0;
    29         }
    30         ans[*te]=x;
    31         if(x==part[y].first&&!use[part[y].second])
    32         {
    33             int z=part[y].second;
    34             p=opt[z].find(y); 
    35             opt[z].erase(p);
    36             if(opt[z].size()==1)
    37                 Q[++right]=z;
    38         }
    39         if(x==part[y].second&&!use[part[y].first])
    40         {
    41             int z=part[y].first;
    42             p=opt[z].find(y);
    43             opt[z].erase(p);
    44             if(opt[z].size()==1)
    45                 Q[++right]=z;
    46         }
    47     }
    48     l=left; r=right;
    49     return 1;
    50 }
    51 void solve()
    52 {
    53     set<int>::iterator te,p;
    54     int i;
    55     l=1; r=0;
    56     for(i=0;i<n;i++)
    57         if(opt[i].size()==1)
    58             Q[++r]=i;
    59     if(!bfs(l,r))
    60         return ;
    61     //for(i=0;i<n;i++)
    62         //printf("%d ",ans[i]);
    63     for(i=0;i<n;i++)
    64     if(ans[i]<0)
    65     {
    66         int x=min(part[i].first,part[i].second);
    67         Q[++r]=x;
    68         te=opt[x].begin();
    69         if(te==opt[x].find(i))
    70             te++;
    71         opt[x].erase(te);
    72         if(!bfs(l,r))
    73             return ;
    74     }
    75     for(i=0;i<n-1;i++)
    76         printf("%d ",ans[i]);
    77     printf("%d\n",ans[n-1]);
    78 }
    79 int main()
    80 {
    81     memset(ans,0xff,sizeof(ans));
    82     memset(use,0,sizeof(use));
    83     scanf("%d",&n);
    84     int i;
    85     int x,y;
    86     for(i=0;i<n;i++)
    87     {
    88         scanf("%d",a+i);
    89         x=(i+a[i])%n;
    90         y=(i-a[i]+n)%n;
    91         part[i]=make_pair(x,y);
    92         opt[x].insert(i);
    93         opt[y].insert(i);
    94     }
    95     solve();
    96     return 0;
    97 }
  • 相关阅读:
    ASP.NET 取得 Uri 各项属性值
    js获取当前时间显示在页面上
    脚步提示及跳转
    整体刷新和局部刷新frameset窗口
    asp.net 字符串过滤
    .net 获取当前网页的的url
    优酷去广告最新的关于如何屏蔽优酷广告的方法
    bat命令集合
    修复IE
    网易见外工作台(AI),语音转文字,快速制作字幕,中英翻译,在线修改字幕
  • 原文地址:https://www.cnblogs.com/myoi/p/2587147.html
Copyright © 2020-2023  润新知