给定n段区间,要求每段区间内没有重复的数字; 构造这样一个序列,使得序列的字典序最小
每次使用数字,从set里提取出来再删掉就行了
题目地址http://acm.hdu.edu.cn/showproblem.php?pid=6301
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
const int maxn=1e5+10;
int last[maxn],col[maxn];//last记录区间的的结尾,col最后的数组
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
int b,c;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){//初始化i对应结尾为自己
last[i]=i;}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&b,&c);
last[b]=max(c,last[b]);//出现更大区间的范围
}
int l=1,r=0;
set<int> s;
for(int i=1;i<=n;i++)
s.insert(i);
for(int i=1;i<=n;i++)
{
if(r>=last[i]) //区间已经被更新
continue;
while(l<i) //之前用过的数字更新恢复
{
s.insert(col[l++]);
}
while(r<last[i]) ////更新当前区间
{
col[++r]=*s.begin();
s.erase(col[r]);
}
}
for(int i=1;i<=n;i++){
if(i==1)printf("%d",col[i]);
else printf(" %d",col[i]);
}
cout<<endl;
}
}