zoukankan      html  css  js  c++  java
  • AC日记——中庸之道 codevs 2021

    2021 中庸之道

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 Description

    给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数。

    数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数。

    输入描述 Input Description

    第一行为N,Q。

    第二行N个数表示序列。

    接下来Q行,每行为L,R,表示一次询问。

    输出描述 Output Description

    输出Q行,对应每次询问的中位数。

    样例输入 Sample Input

    5 3

    1 4 8 16 2

    1 5

    3 5

    3 3

    样例输出 Sample Output

    4

    8

    8

    数据范围及提示 Data Size & Hint

    40%的数据,N,Q≤100;

    70%的数据,N≤100;

    100%的数据,N≤1000,Q≤100000,序列中的元素为1到10^9之间的整数。

    思路:

      主席树裸题;

    来,上代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    struct TreeNodeType {
        int l,r,dis;
        
        TreeNodeType *left,*right;
    };
    struct TreeNodeType *root[1001];
    
    int n,q,if_z,num[1001],num_[1001],size;
    
    char Cget;
    
    inline void read_int(int &now)
    {
        now=0,if_z=1,Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-') if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    
    void tree_build(TreeNodeType *&now,int l,int r)
    {
        now=new TreeNodeType;
        now->l=l,now->r=r,now->dis=0;
        if(l==r) return ;
        int mid=(l+r)>>1;
        tree_build(now->left,l,mid);
        tree_build(now->right,mid+1,r);
    }
    
    void tree_change(TreeNodeType *&pre,int to,TreeNodeType *&now)
    {
        now=new TreeNodeType;
        now->l=pre->l,now->r=pre->r,now->dis=pre->dis+1;
        if(now->l==now->r) return ;
        int mid=(now->l+now->r)>>1;
        if(to<=mid)
        {
            now->right=pre->right;
            tree_change(pre->left,to,now->left);
        }
        else
        {
            now->left=pre->left;
            tree_change(pre->right,to,now->right);
        }
    }
    
    int tree_query(TreeNodeType *pre,TreeNodeType *now,int to)
    {
        if(now->l==now->r) return now->l;
        int dis=now->left->dis-pre->left->dis;
        if(to<=dis) return tree_query(pre->left,now->left,to);
        else return tree_query(pre->right,now->right,to-dis); 
    }
    
    int main()
    {
        read_int(n),read_int(q);
        for(int i=1;i<=n;i++)
        {
            read_int(num[i]);
            num_[i]=num[i];
        }
        sort(num+1,num+n+1);
        size=unique(num+1,num+n+1)-num-1;
        tree_build(root[0],1,size);
        for(int i=1;i<=n;i++)
        {
            num_[i]=lower_bound(num+1,num+size+1,num_[i])-num;
            tree_change(root[i-1],num_[i],root[i]);
        }
        int l,r;
        for(int i=1;i<=q;i++)
        {
            read_int(l),read_int(r);
            int mid=((r-l+1)>>1)+1;
            printf("%d
    ",num[tree_query(root[l-1],root[r],mid)]);
        }
        return 0;
    }
  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6358212.html
Copyright © 2011-2022 走看看