zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    缓冲区
    4.9
    JDBC连接
    3.31
    BizTalk框架概述
    不通过SPS对象模型更改文档扩展字段的方法
    asdfasdf
    设计模式介绍
    Multiple Checkbox Items In A DataGrid Introduction
    Factory Method
  • 原文地址:https://www.cnblogs.com/lalalatianlalu/p/9362571.html
Copyright © 2011-2022 走看看