链接:点击打开链接
题意:n个人去旅游,给出每个人可以参加旅游的最小人数和最大人数,只有在这个区间内这个人才可以参加,问最多参加的人数,并输出任意一种方案
代码:
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int r,id;
friend bool operator<(node a,node b){
return a.r>b.r;
}
};
int l[100005],r[100005],sign[100005];
int main(){
int t,n,i,j;
scanf("%d",&t);
while(t--){
queue<int> ans;
priority_queue<node> tmp,q[100005];
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&l[i]);
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
for(i=1;i<=n;i++){ //把每个左区间存起来
q[l[i]].push((node){r[i],i});
sign[i]=0;
}
i=0;
while(i<=n){ //每次进一个,然后选r小的先出队列
while(q[i].size()){ //然后把左区间符合的都压入队列
tmp.push(q[i].top());
q[i].pop();
}
if(tmp.size()==0)
break;
if(tmp.top().r>=i){
ans.push(tmp.top().id);
i++;
}
tmp.pop();
}
printf("%d\n",ans.size());
while(ans.size()){
sign[ans.front()]=1;
printf("%d ",ans.front());
ans.pop();
}
for(i=1;i<=n;i++)
if(!sign[i])
printf("%d ",i);
printf("\n");
}
return 0;
}