bzoj 3196: Tyvj 1730 二逼平衡树
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<iostream>
#define M 3000009
using namespace std;
struct shu
{
int l,r,sum1,zhi,dui,sum2;
}a[M];
int n,root[M],size,ans,b[M],m;
void you(int &a1)
{
int t=a[a1].l;
a[a1].l=a[t].r;
a[t].r=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void zuo(int &a1)
{
int t=a[a1].r;
a[a1].r=a[t].l;
a[t].l=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void cha(int &a1,int a2)
{
if(!a1)
{
size++;
a1=size;
a[a1].sum1=;
a[a1].sum2=;
a[a1].zhi=a2;
a[a1].dui=rand();
return;
}
a[a1].sum1++;
if(a[a1].zhi==a2)
{
a[a1].sum2++;
return;
}
if(a2<a[a1].zhi)
{
cha(a[a1].l,a2);
if(a[a[a1].l].dui<a[a1].dui)
you(a1);
}
else
{
cha(a[a1].r,a2);
if(a[a[a1].r].dui<a[a1].dui)
zuo(a1);
}
}
void shan(int &a1,int a2)
{
if(a1==)
return;
if(a[a1].zhi==a2)
{
if(a[a1].sum2>)
{
a[a1].sum2--;
a[a1].sum1--;
}
else if(a[a1].l*a[a1].r==)
a1=a[a1].l+a[a1].r;
else if(a[a[a1].l].dui<a[a[a1].r].dui)
{
you(a1);
shan(a1,a2);
}
else
{
zuo(a1);
shan(a1,a2);
}
return;
}
a[a1].sum1--;
if(a[a1].zhi<a2)
shan(a[a1].r,a2);
else
shan(a[a1].l,a2);
return;
}
int cha1(int a1,int a2)
{
if(!a1)
return ;
if(a[a1].zhi==a2)
return a[a[a1].l].sum1;
if(a[a1].zhi>a2)
return cha1(a[a1].l,a2);
return a[a[a1].l].sum1+a[a1].sum2+cha1(a[a1].r,a2);
}
void qian(int a1,int a2)
{
if(!a1)
return;
if(a[a1].zhi<a2)
{
ans=max(a[a1].zhi,ans);
qian(a[a1].r,a2);
}
else
qian(a[a1].l,a2);
return;
}
void hou(int a1,int a2)
{
if(!a1)
return;
if(a[a1].zhi>a2)
{
ans=min(a[a1].zhi,ans);
hou(a[a1].l,a2);
}
else
hou(a[a1].r,a2);
return;
}
void build(int a1,int l,int r,int x,int v)
{
cha(root[a1],v);
if(l==r)
return;
int mid=(l+r)>>;
if(x<=mid)
build(a1*,l,mid,x,v);
else
build(a1*+,mid+,r,x,v);
return;
}
void xicha1(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
ans+=cha1(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xicha1(a1*,l,mid,l1,r1,x);
if(r1>mid)
xicha1(a1*+,mid+,r,l1,r1,x);
return;
}
void xicha2(int l1,int r1,int x)
{
int l2=,r2=,q=;
for(;l2<=r2;)
{
int mid=(l2+r2)>>;
ans=;
xicha1(,,n,l1,r1,mid);
if(ans<=x)
{
q=mid;
l2=mid+;
}
else
r2=mid-;
}
printf("%d\n",q);
}
void change(int a1,int l,int r,int l1,int x,int y)
{
shan(root[a1],y);
cha(root[a1],x);
if(l==r)
return;
int mid=(l+r)>>;
if(l1<=mid)
change(a1*,l,mid,l1,x,y);
else
change(a1*+,mid+,r,l1,x,y);
return;
}
void xiqian(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
qian(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xiqian(a1*,l,mid,l1,r1,x);
if(r1>mid)
xiqian(a1*+,mid+,r,l1,r1,x);
return;
}
void xihou(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
hou(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xihou(a1*,l,mid,l1,r1,x);
if(r1>mid)
xihou(a1*+,mid+,r,l1,r1,x);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
for(int i=;i<=n;i++)
build(,,n,i,b[i]);
for(int i=;i<m;i++)
{
int a1,a2,a3,a4;
scanf("%d%d%d",&a1,&a2,&a3);
if(a1==)
{
scanf("%d",&a4);
ans=;
xicha1(,,n,a2,a3,a4);
printf("%d\n",ans);
}
if(a1==)
{
scanf("%d",&a4);
xicha2(a2,a3,a4);
}
if(a1==)
{
change(,,n,a2,a3,b[a2]);
b[a2]=a3;
}
if(a1==)
{
ans=;
scanf("%d",&a4);
xiqian(,,n,a2,a3,a4);
printf("%d\n",ans);
}
if(a1==)
{
scanf("%d",&a4);
ans=;
xihou(,,n,a2,a3,a4);
printf("%d\n",ans);
}
}
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 二逼平衡树 树套树 线段树 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的,这次开始我并没有看题解,就写出 ...
随机推荐
- Overload和Override的区别
Overload:重载 |- 在一个类中定义的若干方法 |- 所有的方法名相同,但参数类型或个数不同 |- 只有参数有关,与返回类型无关 Override:覆写 |- 在继承的关系中 |- 子类定义了 ...
- 工作上遇到的问题 DEBUG 001
java文件断点跳到对应的class文件解决方式 我也是第一次遇到这个问题,找了很久解决办法.后面找开发组老大才解决. 问题描述: 调试程序,在ExportAction.java文件打断点.debug ...
- python 给定n,返回n以内的斐波那契数列
方式一:函数 def fabs(n): a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b fabs(1000) 方式二:列表 re ...
- python两种生成md5的方法
一. 使用md5包 import md5 src = 'this is a md5 test.' m1 = md5.new() m1.update(src) print m1.hexdigest() ...
- EasyUI、Struts2、Hibernate、spring 框架整合
经历了四个月的学习,中间过程曲折离奇,好在坚持下来了,也到了最后框架的整合中间过程也只有自己能体会了. 接下来开始说一下整合中的问题和技巧: 1, jar包导入 c3p0(2个).jdbc(1个). ...
- service&thread
service:在后台静默运行.服务必须在一个线程中才能运行.长时间的在后台运行,而且不需要交互的情况下,使用服务. thread:在后台运行,但是可以与用户进行相应的交互操作.比如说,音乐播放器,后 ...
- centos7 加入自启动服务的方法 以jexus为例
在/lib/systemd/system 下创建文件jexus.service vi jexus.service 内容如下 Unit Description=jexus After=network.t ...
- web开发字符乱码问题
java动态网页后台乱码问题总结 乱码可能出现的几块地方: 首先是浏览器和html之间采用的编码不一致 解决办法: 修改浏览器的编码格式 修改html页面的编码格式: <meta http-eq ...
- Skyfree退休公告
Skyfree退休公告 https://www.itsk.com/thread-372142-1-1.html Skyfree 发表于 2016-11-14 12:26:51 本以为到了这天,会有很多 ...
- [分享] 封装工具ES4配置文件解释
[分享] 封装工具ES4配置文件解释 LiQiang 发表于 2015-2-3 14:41:21 https://www.itsk.com/thread-346132-1-4.html [分享] 封装 ...