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;
    }
  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/helman/p/11228259.html
Copyright © 2011-2022 走看看