线段树——HYSBZ - 3224

Posted helman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树——HYSBZ - 3224相关的知识,希望对你有一定的参考价值。

题目含义

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

题目分析

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

题目代码

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

#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\n",xrank(1,n,1,1,x-1)+1);
        if(c==4)x=ope[i].x,printf("%d\n",mp[Kith(1,n,1,x)]);
        if(c==5)printf("%d\n",mp[Pre(1,n,1,x)]);
        if(c==6)printf("%d\n",mp[Next(1,n,1,x)]);
    
    return 0;

 

以上是关于线段树——HYSBZ - 3224的主要内容,如果未能解决你的问题,请参考以下文章

P3224 [HNOI2012]永无乡 并查集+线段树合并

HYSBZ 2243 染色 (线段树+树链剖分)

luogu3224 永无乡(动态开点,权值线段树合并)

HYSBZ - 2243 树链剖分 + 线段树 处理树上颜色段数

刷题总结——二逼平衡树(bzoj3224线段树套splay)

HYSBZ 3224 Tyvj 1728 普通平衡树 splay模版