zoukankan      html  css  js  c++  java
  • 线段树——HYSBZ

    题目含义

    题目都给出来了,要你写个线段树

    题目分析

    只要学会了模板,这种题就很简单了

    题目代码

    注:不管怎样,首先要试着默写出来通过一次

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int maxn=1e6+7;
    int a[maxn],b[maxn],la[maxn],mp[maxn];
    int n,sum[maxn<<2];
    struct node{
        int c,x;
    }ope[maxn];
    void add(int l,int r,int rt,int x,int k){
        sum[rt]+=k;
        if(l==r)return;
        int mid=(l+r)>>1;
        if(x>mid)add(mid+1,r,rt<<1|1,x,k);
        if(x<=mid)add(l,mid,rt<<1,x,k);
    }
    int xrank(int l,int r,int rt,int ll,int rr){
        if(ll<=l&&r<=rr)return sum[rt];
        int mid=(l+r)>>1;
        int ans=0;
        if(ll<=mid)ans+=xrank(l,mid,rt<<1,ll,rr);
        if(rr>mid)ans+=xrank(mid+1,r,rt<<1|1,ll,rr);
        return ans;
    }
    int Kith(int l,int r,int rt,int x){
        if(l==r)return l;
        int mid=(l+r)>>1;
        if(x<=sum[rt<<1])return Kith(l,mid,rt<<1,x);
        else return Kith(mid+1,r,rt<<1|1,x-sum[rt<<1]);
    }
    int Findpre(int l,int r,int rt){
        if(l==r)return l;
        int mid=(l+r)>>1;
        if(sum[rt<<1|1])return Findpre(mid+1,r,rt<<1|1);
        else return Findpre(l,mid,rt<<1);
    }
    int Pre(int l,int r,int rt,int v){
        if(v>r){
            if(sum[rt])return Findpre(l,r,rt);
            else return 0;
        }
        int mid=(l+r)>>1,Re;
        if(v>mid+1&&sum[rt<<1|1]&&(Re=Pre(mid+1,r,rt<<1|1,v)))
            return Re;
        else return Pre(l,mid,rt<<1,v);
    }
    int Findnext(int l,int r,int rt){
        if(l==r)return l;
        int mid=(l+r)>>1;
        if(sum[rt<<1])return Findnext(l,mid,rt<<1);
        else return Findnext(mid+1,r,rt<<1|1);
    }
    int Next(int l,int r,int rt,int v){
        if(v<l){
            if(sum[rt])return Findnext(l,r,rt);
            else return 0;
        }
        int mid=(l+r)>>1,Ne;
        if(v<=mid-1&&sum[rt<<1]&&(Ne=Next(l,mid,rt<<1,v)))
            return Ne;
        else return Next(mid+1,r,rt<<1|1,v);
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&ope[i].c,&ope[i].x);
            a[i]=b[i]=ope[i].x;
        }
        sort(b+1,b+1+n);
        for(int i=1;i<=n;i++){
            la[i]=lower_bound(b+1,b+1+n,a[i])-b;
            mp[la[i]]=a[i];
        }
        for(int i=1;i<=n;i++){
            int c=ope[i].c,x=la[i];
            if(c==1)add(1,n,1,x,1);
            if(c==2)add(1,n,1,x,-1);
            if(c==3)printf("%d
    ",xrank(1,n,1,1,x-1)+1);
            if(c==4)x=ope[i].x,printf("%d
    ",mp[Kith(1,n,1,x)]);
            if(c==5)printf("%d
    ",mp[Pre(1,n,1,x)]);
            if(c==6)printf("%d
    ",mp[Next(1,n,1,x)]);
        }
        return 0;
    }
  • 相关阅读:
    android开发布局三(微信布局)
    Android开发adb,SQLite数据库运用
    直线电机磁负荷、电负荷
    MIT公开课(一):电场和偶极子
    哈工大电气工程系硕士研究生入学复试——自动控制原理1、2章
    直线电机与旋转电机的区别
    Math类介绍
    Scala编辑器和IntelliJ IDEA开发环境配置
    减少cpu的方法
    AS内存清理,建议以及查找内存泄露的方法
  • 原文地址:https://www.cnblogs.com/helman/p/11228259.html
Copyright © 2011-2022 走看看