【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能。
部分操作的时间复杂度:
| 插入 | 删除 | 全局排名 | 全局K大 | 前驱 | 后继 | 全局最值 | 按值域删除元素 |
| O(1) | O(1) | O(sqrt(n)) | O(sqrt(n)) | O(sqrt(n)) | O(sqrt(n)) | O(sqrt(n)) | O(sqrt(n))(懒标记) |
当然,因为要离散化,所以只能离线。
代码很短,很快,比我的Splay短一倍,快一倍,现在在bzoj上rank6。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 100001
struct Point{int v,p;}t[N];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int n,op[N],a[N],ma[N],en,l[],r[],sumv[],sz,sum,num[N],b[N],Num,CH[];
inline void R(int &x){
char c=;int f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
inline void P(int x)
{
if(!x){putchar('');puts("");return;}
if(x<){putchar('-');x=-x;}Num=;
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);puts("");
}
void makeblock()
{
sz=sqrt(en); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+;
r[sum]=sz*sum;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
inline void Insert(const int &x){b[x]++; sumv[num[x]]++;}
inline void Delete(const int &x){b[x]--; sumv[num[x]]--;}
inline int Rank(const int &x)
{
int cnt=;
for(int i=;i<num[x];i++) cnt+=sumv[i];
for(int i=l[num[x]];i<x;i++) cnt+=b[i];
return cnt+;
}
inline int Kth(const int &x)
{
int cnt=;
for(int i=;;i++)
{
cnt+=sumv[i];
if(cnt>=x)
{
cnt-=sumv[i];
for(int j=l[i];;j++)
{cnt+=b[j]; if(cnt>=x) return j;}
}
}
}
inline int Next(const int &x)
{
for(int i=x+;i<=r[num[x]];i++) if(b[i]) return i;
for(int i=num[x]+;;i++) if(sumv[i])
for(int j=l[i];;j++)
if(b[j]) return j;
}
inline int Pre(const int &x)
{
for(int i=x-;i>=l[num[x]];i--) if(b[i]) return i;
for(int i=num[x]-;;i--) if(sumv[i])
for(int j=r[i];;j--)
if(b[j]) return j;
}
int main()
{
R(n); for(int i=;i<=n;i++)
{
R(op[i]); R(t[i].v);
t[i].p=i;
}
sort(t+,t+n+);
ma[a[t[].p]=++en]=t[].v;
for(int i=;i<=n;i++)
{
if(t[i].v!=t[i-].v) en++;
ma[a[t[i].p]=en]=t[i].v;
}
makeblock();
for(int i=;i<=n;i++)
{
if(op[i]==) Insert(a[i]);
else if(op[i]==) Delete(a[i]);
else if(op[i]==) P(Rank(a[i]));
else if(op[i]==) P(ma[Kth(ma[a[i]])]);
else if(op[i]==) P(ma[Pre(a[i])]);
else P(ma[Next(a[i])]);
}
return ;
}
【权值分块】bzoj3224 Tyvj 1728 普通平衡树的更多相关文章
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...
- [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- BZOJ3224——Tyvj 1728 普通平衡树
1.题目大意:数据结构题,是treap,全都是treap比较基本的操作 2.分析:没啥思考的 #include <cstdio> #include <cstdlib> #inc ...
随机推荐
- QT QLayout 清空
QLayout* pLayout = (QLayout*)ui->frame->layout(); )) { QWidget* pWidget = child->widget(); ...
- 稀疏编码概率解释(基于1996年Olshausen与Field的理论 )
一.Sparse Coding稀疏编码 稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据.稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量 表示为这些 ...
- [Leetcode Week3]Clone Graph
Clone Graph题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/clone-graph/description/ Description Clon ...
- Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】
转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...
- try_module_get和module_put【转】
转自:http://blog.csdn.net/adaptiver/article/details/7000617 转自:http://apps.hi.baidu.com/share/detail/4 ...
- (12)Linux shell之read 用法
Linux shell之read 用法 #!/bin/bash#read 用来读取屏幕输入或是读取文件内容.read -p "please input you name: " ...
- 【反演复习计划】【bzoj4407】于神之怒加强版
#include<bits/stdc++.h> #define N 5000010 #define yql 1000000007 using namespace std; typedef ...
- 【C++】const、volatile不能修饰没有this指针的成员函数
一般所有的成员函数都只有一个复本,当不同的对象调用成员函数时,为了区分是哪个成员在调用,会传入this指针. 当调用有const.volatile修饰的成员函数时,会相应的传入一个const.vola ...
- java使用maven项目(二)分模块开发
1 整合ssh框架 1.1 依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 1.2 依赖版本冲突的解决 1. 第 ...
- Python垃圾回收机制:gc模块(zz)
在Python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收. 由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为不必再受内存泄漏的骚扰了.但如果仔细查看一 ...