【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的,这次开始我并没有看题解,就写出 ...
随机推荐
- 【Linux C中文函数手册】 字符串转换函数
字符串转换函数 1)atof 将字符串转换成浮点型数 相关函数 atoi,atol,strtod,strtol,strtoul表头文件 #include <stdlib.h>定义函数 do ...
- SQLSERVER中按年月分组
SQLSERVER中按年月分组 一个表有三个字段id,dt,d 分别存放id,时间,数值 id dt d 1 2004-08-11 12:12:00.000 9 2 2005-09- ...
- python:笔记for循环中的else
我们常常会在for循环遍历一个序列或者字典后,接着语句else,很多新手会误以为是判断执行else后面的 代码,其实不然,for循环里面也不存在判断,而已执行完遍历的对象后,再执行else后面的代码. ...
- .Net的基础概念
1,参数传递. 默认都是按值传递(无论引用还是值类型),也就意味着传递参数的一个副本给方法.之后在方法体内对参数的更改,对原始参数没有影响. 使用ref/out可以按引用传递,直接影响原始参数变量.两 ...
- (转)RabbitMQ 安装和监控
在Windows上安装Rabbit MQ 指南,最好的是这篇<Rabbit MQ Windows Installation guide>,其中还包括了使用.NET RabbitMQ.Cli ...
- nyoj---t448(寻找最大数)
描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测 ...
- Codevs 2894 Txx考试
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今天 ...
- ProgressIndicator显示进度条以及一些文字信息
//ProgressIndicator可以显示进度条以及一些文字信息,不过这个属性一般都在cs文件中操作. private void PhoneApplicationPage_Loaded(objec ...
- 12.iscsi-target
server: 环境:rhel7.2 软件包:targetcli-2.1.fb41-3.el7.noarch,selinux-policy-targeted-3.13.1-60.el7.noarch ...
- UBUNTU12.4 安装磊科无线网卡驱动
UBUNTU12.4 安装磊科无线网卡驱动 在淘宝低价买了一个网卡,回来发现不能用 ,擦 无语了. 无赖只能在网上各种找驱动,编译 安装 .今天在终于安装好了WIFI驱动了: 下载地址:https:/ ...