【HDOJ6301】Distinct Values(贪心,set)

题意:给定一个n个数的数列与m个区间,要求每个区间内的数字互不相同,求使得数列字典序最小的方案

n<=1e5

思路:

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 #include<set>
 5 #define N 110000
 6 using namespace std;
 7 int cas,ends[N],ans[N];
 8 
 9 int main()
10 {
11     freopen("1004.in","r",stdin);
12     freopen("1004.out","w",stdout);
13     scanf("%d",&cas);
14     while(cas--)
15     {
16         int n,m;
17         scanf("%d%d",&n,&m); 
18         //printf("%d %d",n,m);
19        // for(int i=1;i<=N;i++) ends[i]=0;
20         for(int i=1;i<=n;i++) ends[i]=i;
21         for(int i=1;i<=m;i++)
22         {
23           int l,r;
24           scanf("%d%d",&l,&r);
25           //printf("%d %d\n",l,r);
26           ends[l]=max(ends[l],r);
27         }
28         set<int>unused;
29         for(int i=1;i<=n;i++) unused.insert(i);
30         int l=1,r=0;
31         for(int i=1;i<=n;i++)
32         {
33           if(r>=ends[i]) continue;
34           while(l<i) unused.insert(ans[l++]);
35           while(r<ends[i])
36           {
37               ans[++r]=*unused.begin();
38               unused.erase(ans[r]);
39           }
40         }
41         for(int i=1;i<=n;i++)
42         {
43             printf("%d",ans[i]);
44             if(i<n) printf(" ");
45         }
46         //printf("%d %d",n,m);
47         printf("\n");
48     }
49     return 0;
50 }
51 
52 
53  

 

posted on 2018-07-30 10:42  myx12345  阅读(248)  评论(0编辑  收藏  举报

导航