题意:
给出一组长度为n的数组,有m个区间内的数不相同,并且按字典排序为最小
例如题目中的第三个例子为 5 2 1 3 2 4
共有5个数,有2个要求
1-3不一样 2-4不一样
很明显就可以知道1-3的排序为1 2 3,而2-4的排序为2 3 1,剩下没有要求的按1填充
所以答案就为1 2 3 1 1
思路:
用一个优先队列把n个数先存下来,数据 10 2,1 5,3 9 的答案为 1 2 3 4 5 1 2 6 7 1
其中前一段的红色部分可以共用,就将其存进优先队列而后输出。
代码如下 另附三个测试数据
#include<bits/stdc++.h>
using namespace std;
struct pp{
int k;
int l;
}a[100001];
int cmp(struct pp a1, struct pp b){
if(a1.k==b.k){
return a1.l>b.l;
}
return a1.k<b.k;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int ans[100000];
int n,m;
priority_queue<int,vector<int>,greater<int> >qi;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
ans[i]=-1;
qi.push(i);
}
for(int i=1;i<=m;i++){
scanf("%d %d",&a[i].k,&a[i].l);
}
sort(a+1,a+1+m,cmp);
int minn=1;
int maxx=1;
int mark=1;
int j;
for(j=mark;j<=m;j++){
if(a[j].k==a[j-1].k)
continue;
for(int k=minn;k<a[j].k;k++){
if(ans[k]==-1){
ans[k]=1;
}
else{
qi.push(ans[k]);
}
}
for(int k=maxx;k<=a[j].l;k++){
if(ans[k]==-1){
ans[k]=qi.top();
qi.pop();
}
}
minn=a[j].k;
maxx=max(maxx,a[j].l);
}
for(int i=1;i<=n;i++){
if(i!=1){
printf(" ");
}
if(ans[i]==-1){
ans[i]=1;
}
printf("%d",ans[i]);
}
printf("\n");
}
}
//1
//11 3
//1 4
//3 7
//5 11
//1
//10 3
//1 5
//5 7
//7 9
//1
//7 2
//1 3
//5 7