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 }

 

 

posted on 2012-07-11 22:17  myoi  阅读(244)  评论(0编辑  收藏  举报

导航