线段树——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的主要内容,如果未能解决你的问题,请参考以下文章
HYSBZ - 2243 树链剖分 + 线段树 处理树上颜色段数