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的,这次开始我并没有看题解,就写出 ...
随机推荐
- linux内核追踪——find_next_bit函数详详详解
写在前面 宗旨:把话说清楚,把道理讲透彻. 约定:所有代码均来自Linux内核2.6.24版. 建议:本文介绍得十分详细,但也略显繁琐,读者可以先看“Ⅴ.总结”部分带注释的源码,如果哪里不清楚,再回头 ...
- UE4 AI入门
转自:http://blog.csdn.net/u011707076/article/details/46607121 本文是翻译的官方文https://docs.unrealengine.com/l ...
- reactive-turtle
reactive-turtle 标签(空格分隔): Scala Github 偶然在Github上看到一个有意思的小项目,一个粑粑教11岁的儿子学习scala,因为学习语法等太枯燥了,所以写了一个海龟 ...
- python http代理代码
googlecode :https://code.google.com/archive/p/python-proxy/source/default/source # -*- coding: cp125 ...
- Sprint第三阶段(第四天12.12)
- batch
%0 当前 batch 文件名 %n 第 n 个命令行参数(1 <= n <= 9) %* 所有的命令行参数 @echo off echo % echo % if not &q ...
- WCF与WebService的区别
1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...
- venus
The Venus system was a small timesharing system serving five or six users at a time:分时系统 The design ...
- org.dbunit.database.ambiguoustablenameexception
对于一个数据库下面多个shema的情况,如果使用DBUNIT配置会出现,上面的错误,不清楚的表名,解决如下 增加红色的shema指定 参考:http://stackoverflow.com/quest ...
- mysql delete 使用别名 语法
今天删除数据,写了这么条sql语句, DELETE from sys_menus s WHERE s.MENU_ID in (86,87,88); 结果报错.. [Err] 1064 - You ...