【BZOJ】【3196】Tyvj 1730 二逼平衡树
树套树
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 二逼平衡树的更多相关文章
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- bzoj 3196: Tyvj 1730 二逼平衡树
#include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay
传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...
- BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)
题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...
- bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】
四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...
随机推荐
- MYSQL多实例配置与使用教程
原文http://www.111cn.net/database/mysql/58651.htm 在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 ...
- easyui中Tab的tools按钮刷新当前tab
easyui中Tab的tools按钮刷新当前tab 点击刷新按钮,刷新当前Tab选项卡. $('#index_tabs').tabs({ fit : true, border : false, too ...
- [老老实实学WCF] 第四篇 初探通信--ChannelFactory
老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了. ...
- 【学习笔记】【C语言】第一个C程序
1.新建C语言程序 *打开Xcode *新建文件 *选择C语言程序 *输入程序名称 *选择存放路径 *创建完成后 2.也可以用终端来创建 通过指令来创建.c文件 3.编写代码 4. ...
- UI2_ScrollViewHomeWork
// // AppDelegate.m // UI2_ScrollViewHomeWork // // Created by zhangxueming on 15/7/13. // Copyright ...
- java mail jar冲突
开发环境:jdk1.6.0_25 MyEclipse-8.6 J2EE5 程序编译通过,J2EE5的库里面已经含有javaee.jar文件.里面的javax.mail包下面是jav ...
- 一个适用于层级目录结构的makefile模版
今天写了个层次化的Makefile模版,用来自动化编译项目,这个模版应当包含以下功能: 适用于层次化结构,Makefile主要内容都放在顶层目录下的Makefile.env中,子层Makefile包含 ...
- python 实现梯度下降
在多元线性回归中会用到梯度下降来计算参数值.这里我用python实现一个梯度下降版本. 这里多元线性方程为 y = A0+A1*x1+...+An* xn 数据输入格式,y表示 y \t x1 \t ...
- 使用ResultSet,写了一个通用的查询方法
此方法很烂,以后优化 /** * 通用的查询方法:SELECT */ @SuppressWarnings({ "unchecked", "rawtypes" } ...
- Linux时间相关函数
相关文件: /etc/localtime 本地时间二级制文件 /etc/sysconfig/clock 时区配置文件 /usr/share/zoneinfo 存储各个时区的二进制文件 时间修改方 ...