HDU 6301 Distinct Values(优先队列)

思路:就是让你构造一个数列,然后使每次询问的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;
}
原文地址:https://www.cnblogs.com/lalalatianlalu/p/9362571.html