zoukankan      html  css  js  c++  java
  • 主席树

    这只是一个模板...具体算法qsc已经讲的很清楚了(QAQ)

    模板链接

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    struct node {
          int l,r,sum;
    }d[8400000];
    int a[210000],b[210000],cnt,root[210000],tot;
    map<int,int>id;
    map<int,int>wh;
    void update(int le,int ri,int &x,int y,int pos){
          d[++cnt]=d[y];
          d[cnt].sum++;
          x=cnt;
          if(le==ri)return;
          int mid=(le+ri)>>1;
          if(mid>=pos)update(le,mid,d[x].l,d[y].l,pos);
            else update(mid+1,ri,d[x].r,d[y].r,pos);
    }
    int que(int le,int ri,int x,int y,int k){
          if(le==ri)return le;
          int mid=(le+ri)>>1;
          int s=d[d[y].l].sum-d[d[x].l].sum;
          if(s>=k)return que(le,mid,d[x].l,d[y].l,k);
            else return que(mid+1,ri,d[x].r,d[y].r,k-s);
    }
    int main()
    {     int n,m,i,j,k,x,y;
          scanf("%d%d",&n,&m);
          for(i=1;i<=n;i++){
             scanf("%d",&a[i]);
             b[i]=a[i];
          }
          sort(b+1,b+1+n);
          for(i=1;i<=n;i++)
             if(!id[b[i]]){
                 id[b[i]]=++tot;
                 wh[tot]=b[i];
             }
          for(i=1;i<=n;i++)update(1,n,root[i],root[i-1],id[a[i]]);
          for(i=1;i<=m;i++){
               scanf("%d%d%d",&x,&y,&k);
               printf("%d ",wh[que(1,n,root[x-1],root[y],k)]);
          }
          return 0;
    }

  • 相关阅读:
    【 数据结构(C语言)】栈的应用——行编辑程序
    【 数据结构 (C语言)】栈的应用(二)——括号匹配问题
    节点
    页面加载--延迟加载
    雅黑php 探针
    Swiper 触屏滑动切换
    tab 选择悬停展示
    翻牌抽奖功能讲解
    公告信息滚动功能
    织梦提交表单不进行跳转
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9056320.html
Copyright © 2011-2022 走看看