一个序列n个数(都为正整数),给出m对l,r,任意一对区间内的数都不相同。求字典序最小的n序列。
思路:
给所有区间排序,按顺序往区间里放数。在优先队列里放1--n,for循环往结果数组中放或者从结果数组里回收。
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int l,r;
bool operator < (const Node &other) const
{
if(l==other.l)
return r>other.r;
return l<other.l;
}
}node[100010];
int ans[100010];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,i,j;
priority_queue< int , vector<int> , greater<int> >q;//如果设为全局变量,每次初始化需要清空
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
q.push(i);
}
for(i=0;i<m;i++)
{
scanf("%d%d",&node[i].l,&node[i].r);
}
sort(node,node+m);
int cnt=1,cnt2=1;
for(i=0;i<m;i++)
{
while(cnt<node[i].l)//未被区间覆盖
{
ans[cnt++]=1;
}
while(cnt2<node[i].l)//回收数入队列
{
if(ans[cnt2]==1&&q.top()==1)
{
cnt2++;
}
else
{
q.push(ans[cnt2++]);
}
}
while(cnt<=node[i].r)
{
ans[cnt++]=q.top();
q.pop();
}
}
while(cnt<=n)
ans[cnt++]=1;
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}