树套树


  Orz zyf

  学(co)习(py)了一下树套树的写法,嗯……就是线段树套平衡树。

  具体实现思路就是:外部查询用的都是线段树,查询内部自己调用平衡树的操作。

  抄抄代码有助理解= =

八中挂了……话说tyvj上最后两组ex数据好恶心……

 /**************************************************************
Problem: 3196
User: Tunix
Language: C++
Result: Accepted
Time:6240 ms
Memory:50692 kb
****************************************************************/ //BZOJ 3196
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,M=,INF=~0u>>;
const double eps=1e-;
/*******************template********************/ int n,m,tot,a[N],l[M],r[M],s[M],rnd[M],w[M],v[M];
#define L l[x]
#define R r[x]
struct tree{
int l,r,rt;
}t[*N];
inline void Push_up(int x){
s[x]=s[L]+s[R]+w[x];
}
inline void zig(int &x){
int t=L; L=r[t]; r[t]=x; s[t]=s[x]; Push_up(x); x=t;
}
inline void zag(int &x){
int t=R; R=l[t]; l[t]=x; s[t]=s[x]; Push_up(x); x=t;
}
void ins(int &x,int num){
if (!x){
x=++tot; v[x]=num; s[x]=w[x]=; L=R=; rnd[x]=rand(); return;
}
s[x]++;
if (v[x]==num) w[x]++;
else if(num<v[x]){
ins(L,num); if(rnd[L]<rnd[x]) zig(x);
}else{
ins(R,num); if(rnd[R]<rnd[x]) zag(x);
}
}
void del(int &x,int num){
if (v[x]==num){
if (w[x]>){w[x]--; s[x]--;}
else if(L*R==) x=L+R;
else if(rnd[L]<rnd[R]){
zig(x); del(x,num);
}else{
zag(x); del(x,num);
}
return;
}
s[x]--;
if (num<v[x]) del(L,num);
else del(R,num);
}
int rank(int x,int num){
if (!x) return ;
if (v[x]==num) return s[L];
else if(num<v[x]) return rank(L,num);
else return s[L]+w[x]+rank(R,num);
}
int pre(int x,int num){
if (!x) return -INF;
if (num<=v[x]) return pre(L,num);
else{
int t=pre(R,num);
return t==-INF? v[x] : t;
}
}
int suc(int x,int num){
if (!x) return INF;
if (num>=v[x]) return suc(R,num);
else{
int t=suc(L,num);
return t==INF?v[x]:t;
}
}
#undef L
#undef R
/******************Treap************************/
#define L (o<<1)
#define R (o<<1|1)
void build(int o,int x,int y){
int l=t[o].l=x,r=t[o].r=y,mid=l+r>>;
F(i,l,r) ins(t[o].rt,a[i]);
if (l==r) return;
build(L,l,mid); build(R,mid+,r);
}
void update(int o,int x,int y){//update a[x]=y
int l=t[o].l,r=t[o].r,mid=l+r>>;
del(t[o].rt,a[x]); ins(t[o].rt,y);
if (l==r) return;
if (x<=mid) update(L,x,y);
else update(R,x,y);
}
int query(int o,int x,int y,int k){
int l=t[o].l,r=t[o].r,mid=l+r>>;
if (l==x && r==y) return rank(t[o].rt,k);
if (y<=mid) return query(L,x,y,k);
else if (x>mid) return query(R,x,y,k);
else return (query(L,x,mid,k)+query(R,mid+,y,k));
}
int getpre(int o,int x,int y,int k){
int l=t[o].l,r=t[o].r,mid=l+r>>;
if (l==x && r==y) return pre(t[o].rt,k);
if (y<=mid) return getpre(L,x,y,k);
else if(x>mid) return getpre(R,x,y,k);
else return max(getpre(L,x,mid,k),getpre(R,mid+,y,k));
}
int getsuc(int o,int x,int y,int k){
int l=t[o].l,r=t[o].r,mid=l+r>>;
if (l==x && r==y) return suc(t[o].rt,k);
if (y<=mid) return getsuc(L,x,y,k);
else if(x>mid) return getsuc(R,x,y,k);
else return min(getsuc(L,x,mid,k),getsuc(R,mid+,y,k));
} int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
n=getint(); m=getint();
F(i,,n) a[i]=getint();
build(,,n);
int x,y,z,ch;
while(m--){
ch=getint();
if (ch==){ x=getint(); y=getint(); update(,x,y); a[x]=y;}
else{
x=getint(); y=getint(); z=getint();
if (ch==){
int l=,r=INF;
while(l<=r){
int mid=l+r>>;
if (query(,x,y,mid)+>z) r=mid-;
else l=mid+;
}
printf("%d\n",r);
}
if (ch==) printf("%d\n",query(,x,y,z)+);
if (ch==) printf("%d\n",getpre(,x,y,z));
if (ch==) printf("%d\n",getsuc(,x,y,z));
}
}
return ;
}

【BZOJ】【3196】Tyvj 1730 二逼平衡树的更多相关文章

  1. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  2. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  3. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  4. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

  5. BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...

  6. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  7. BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay

    传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...

  8. BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)

    题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...

  9. bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】

    四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...

  10. 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...

随机推荐

  1. MySQL 数据类型 详解 (转载)

    数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指 ...

  2. ajax请求简写

    <script type="text/javascript"> function changle() { $.post( "SendMail", / ...

  3. jquery动态移除/增加onclick属性详解

     本文章给大家介绍利用jquery的removeAttr与attr事件来给a标签增加与删除onclick事件的具体操作方法,有需要了解的朋友可参考. 要实现效果:点击链接先去掉onclick属性,3秒 ...

  4. 同一个tomcat多个web应用共享session

    tomcat版本:apache-tomcat-6.0.29(次方tomcat6和tomcat7支持)   1.修改D:\apache-tomcat-6.0.29\conf\server.xml文件   ...

  5. SQL server基本操作(一)

      --1.create database CREATE DATABASE MyDB GO --2.use database USE MyDB GO --3.create table CREATE T ...

  6. 卡通投掷游戏ios源码

    卡通投掷游戏源码,一款基于cocos2d很有意思的卡通投掷游戏源码,使用重力感应摇动手机让猴子打转,然后点击屏幕任何地方将猴子抛出去,抛出去的过程中会收集星星,游戏的规则就是抛得越远越好,收集的星星最 ...

  7. Linux下安装Websphere MB所需的系统rpm包

    很少使用到Linux,这次刚好用户有一个在linux下搭建Websphere MB/MQ的任务.试了几次都不行,经过多方打听,询问原来是少了rpm包的问题,但是,具体包名不详.. --#mount / ...

  8. 将word中的“空格” 转换为换行符

  9. Spannable相关方法

    实现文本链接 其中tv是TextView类型的控件.只需写java代码即可实现链接,无需在xml文件中进行其他的设置. SpannableString spanTxt = new SpannableS ...

  10. 深入剖析——float之个人见解

    浮动的原本作用仅仅是为了实现文字的环绕效果. 以下分别是html与css代码,显示效果如下图.因为两个div使用了float浮动属性,所以脱离了标准文档流.让父元素撑开高度,我们需要清除浮动. < ...