树套树


  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. ORACLE-树状数据结构获取各层级节点信息

    平时工作中出报表时,要求分别列出员工的一级部门,二级部门....,在数据库中,部门表(unit)的设计一般为在表中维护每个部门的上级部门(pid字段),或者通过一个关联表(unit_link)维护层级 ...

  2. (转)Centos5.5安装MONO2.10.8和Jexus 5.0开启Linux平台.net应用新篇章

    注:本文只做本人记录使用,也可供大家参考,有兴趣的可以一起讨论. 安装步骤 1.yum –y update 2.安装Mono源码安装需要的库 yum -y install gcc gcc-c++ bi ...

  3. hdu 3665 Seaside floyd+超级汇点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3665 题意分析:以0为起点,求到Sea的最短路径. 所以可以N为超级汇点,使用floyd求0到N的最短 ...

  4. <邮件服务postfix+mysql>MAIL第二篇

    环境:本服务是建立在第一篇的基础之上的,最好搭建好第一篇 玩此服务的前提是你的系统装好了msql和postfix服务. Postfix+mysql主要是把邮件服务的发与mysql结合使用.当然mysq ...

  5. Matlab2012a第一次安装打不开 查找程序安装类时出错

    打开bin文件夹下的matlab!!!!!!进行激活~

  6. 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时)

    今天忽然间发现远程连接别人数据库会出现  已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时)  这种情况 ...

  7. js中(function(){…})()立即执行函数写法理解(转载oschina)

    ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到 ...

  8. 动画气泡指示当前滑动值--第三方开源--DiscreteSeekbar

    DiscreteSeekbar在github上的项目主页是:https://github.com/AnderWeb/discreteSeekBar DiscreteSeekbar可以自定制的属性很多, ...

  9. 开发流程习惯的养成—TFS简单使用

    才开始用,所以是个很基础的介绍,欢迎大家一起交流学习 一.追本溯源 讲到开发流程,还要从敏捷开始,因为敏捷才有了开发流程的重视,整个流程也是按照敏捷的思想进行的,这里不再叙述敏捷的定义 敏捷的流程(个 ...

  10. Oracle中的注释

    注释用于对程序代码的解释说明,它能够增强程序的可读性,是程序易于理解. 单行注释: 用“--”,后面跟上注释的内容 Declare Num_sal number; --声明一个数字类型的变量 Var_ ...