【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
null