题目:构造一个字典序最小的序列,满足给的m个条件,每个条件一个区间(l , r)内没有重复出现的数字。
比赛时我想的是set维护下,排个序然后往后扫,不过没有写,队友写的优先队列的。刚刚写了一下,运行时间比优先队列的要长。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int l,r;
}s[maxn];
bool cmp(const node &a,const node&b)
{
if(a.l==b.l) return a.r>b.r;
return a.l<b.l;
}
int a[maxn],n,m,t;
set<int>se;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(a,0,sizeof a);
for(int i=1;i<=m;i++)
scanf("%d%d",&s[i].l,&s[i].r);
sort(s+1,s+m+1,cmp);
se.clear();
for(int i=1;i<=n;i++)
se.insert(i);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(l<s[i].l)
{
if(a[l]!=0)
se.insert(a[l]);
else a[l]=1;
l++;
}
while(r<s[i].r)
{
r++;
if(!a[r])
{
a[r]=*se.begin();
se.erase(a[r]);
}
}
}
while(r<n) a[++r]=1;
printf("%d",a[1]);
for(int i=2;i<=n;i++)
printf(" %d",a[i]);
puts("");
}
return 0;
}