思路:就是让你构造一个数列,然后使每次询问的LR中没有相同的数
思路:耻辱下机,这个题卡了快4个小时,一直T,T到天荒地老,我觉得之前写的map和优先队列也挺优秀的啊,最后写的双指针虽然复杂度有点玄学,但也还好啊,我们直接把所有的数压入优先队列中,对于没一个位置我们只用一直弹就行了,也相当于用2个指针,一个右端点,一个左端点,相当于知道那些书该想队列中加入,,每次只用弹就行了
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<cmath> #include<queue> #include<functional> using namespace std; const int maxn=1e5+5; int num[maxn],cnt[maxn]; struct node { int l,r; bool operator <(const node &b)const { if(l==b.l) return r>b.r; return l<b.l; } }a[maxn]; int main() { int T; scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&a[i].l,&a[i].r); } sort(a+1,a+1+m); priority_queue<int,vector<int>,greater<int> > q; for(int i=1;i<=n;i++)q.push(i); memset(cnt,0,sizeof(cnt)); memset(num,0,sizeof(num)); cnt[0]=1; int LL=0,R=0; for(int i=1;i<=m;i++){ if(a[i].l==LL){ continue; } if(a[i].r<=R)continue; for(int j=LL;j<a[i].l;j++){ if(cnt[num[j]]==0){ q.push(num[j]); cnt[num[j]]=1; } } if(a[i].l>R){ for(int j=a[i].l;j<=a[i].r;j++){ num[j]=q.top(); cnt[num[j]]=0; q.pop(); } } else{ for(int j=R+1;j<=a[i].r;j++){ num[j]=q.top(); cnt[num[j]]=0; q.pop(); } } R=a[i].r; LL=a[i].l; } for(int i=1;i<=n;i++){ if(i>1)printf(" "); if(num[i]<=1)printf("1"); else printf("%d",num[i]); } puts(""); } return 0; }