zoukankan      html  css  js  c++  java
  • HDU 4417 Super Mario 主席树查询区间小于某个值的个数

       

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<vector>
    #define LL long long
    #define rep(i,j,k) for(int i=j;i<=k;i++)
    #define per(i,j,k) for(int i=j;i>=k;i--)
    #define pb push_back
    #define pii pair<int,int>
    #define mp make_pair
    using namespace std;
    const int maxx = 1e5+6;
    vector<int>v;
    struct node{
      int l,r,w;
    }tree[maxx*20];
    int cnt;
    int root[maxx],a[maxx];
    int l[maxx],r[maxx],h[maxx];
    int getid(int x){
       return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
    }
    void inserts(int l,int r,int pre,int &now,int pos,int val){
        ///新建节点编号
        now=++cnt;
        ///拷贝并更新节点信息
        tree[now]=tree[pre];
        if (l==r){
                tree[now].w+=val;
            return ;
        }
        int mid=(l+r)>>1;
        if (pos<=mid){
              inserts(l,mid,tree[pre].l,tree[now].l,pos,val);
        }else {
              inserts(mid+1,r,tree[pre].r,tree[now].r,pos,val);
        }
        //维护区间数字的个数目
        tree[now].w=tree[tree[now].l].w+tree[tree[now].r].w;
    }
    int query(int pre,int now,int l,int r,int pos){
         if (l==r){
            //查询某个区间数字的个数,就是两个版本权值线段树个数的差值
            return tree[now].w-tree[pre].w;
         }
         int mid=(l+r)>>1;
         if (pos<=mid){
          return query(tree[pre].l,tree[now].l,l,mid,pos);
         }else {
          return tree[tree[now].l].w-tree[tree[pre].l].w+query(tree[pre].r,tree[now].r,mid+1,r,pos);
         }
    }
    int main(){
      int t;
      int n,m;
      scanf("%d",&t);
      int ca=0;
      while(t--){
         ca++;
         printf("Case %d:
    ",ca);
         cnt=0;
         scanf("%d%d",&n,&m);
         v.clear();
         memset(root,0,sizeof(root));
         memset(tree,0,sizeof(tree));
         for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            v.pb(a[i]);
         }
         for (int i=1;i<=n;i++){
             scanf("%d%d%d",&l[i],&r[i],&h[i]);
             v.push_back(h[i]);///注意为了防止出错,你需要同时离散高度,防止高度出现问题
         }
         sort(v.begin(),v.end());
         v.erase(unique(v.begin(),v.end()),v.end());
         int sz=v.size();
         for (int i=1;i<=n;i++){
            int x=getid(a[i]);
            inserts(1,sz,root[i-1],root[i],x,1);
         }
         for (int i=1;i<=m;i++){
            int posc=getid(h[i]);
            l[i]++;
            r[i]++;
            if (posc==0)printf("0
    ");
            else
            printf("%d
    ",query(root[l[i]-1],root[r[i]],1,sz,posc));
         }
      }
      return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    低版本ie模式 360兼容模式的兼容性调节以及控制代码
    360浏览器兼容模式样式乱码的原因及解决办法
    iOS开发之UILabel
    代码大全--第六章--可以工作的类
    读书笔记--软件项目成功之道
    extern "C"的用法解析(转)
    基于Ubuntu 15.04 LTS编译Android5.1.0源代码 (转)
    Global.asax 文件是什么(转)
    设备扩展(DEVICE_EXTENSION)
    IRP_MJ_CREATE
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/11360326.html
Copyright © 2011-2022 走看看