【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子。
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100001
struct Data
{
int v,p;
}t[N];
bool cmp(const Data &a,const Data &b)
{
return a.v<b.v;
}
int T[N<<2],op[N],a[N],n,ma[N],e;
void Update(int p,int v,int rt,int l,int r)//插入删除
{
T[rt]+=v;
if(l==r) return;
int m=(l+r>>1);
if(p<=m) Update(p,v,rt<<1,l,m);
else Update(p,v,rt<<1|1,m+1,r);
}
int Kth(int K,int rt,int l,int r)//K小值
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1]>=K) return Kth(K,rt<<1,l,m);
return Kth(K-T[rt<<1],rt<<1|1,m+1,r);
}
int Rank(int p,int rt,int l,int r)//排名
{
if(r<p) return T[rt];
int m=(l+r>>1),res=0;
res+=Rank(p,rt<<1,l,m);
if(m<p-1) res+=Rank(p,rt<<1|1,m+1,r);
return res;
}
int Findp(int rt,int l,int r)
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1|1]) return Findp(rt<<1|1,m+1,r);
return Findp(rt<<1,l,m);
}
int Pre(int p,int rt,int l,int r)
{
if(r<p)
{
if(T[rt]) return Findp(rt,l,r);
return 0;
}
int m=(l+r>>1),Re;
if(m<p-1 && T[rt<<1|1] && (Re=Pre(p,rt<<1|1,m+1,r))) return Re;
return Pre(p,rt<<1,l,m);
}
int Findn(int rt,int l,int r)
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1]) return Findn(rt<<1,l,m);
return Findn(rt<<1|1,m+1,r);
}
int Nex(int p,int rt,int l,int r)
{
if(p<l)
{
if(T[rt]) return Findn(rt,l,r);
return 0;
}
int m=(l+r>>1),Re;
if(p<m && T[rt<<1] && (Re=Nex(p,rt<<1,l,m))) return Re;
return Nex(p,rt<<1|1,m+1,r);
}
int main()
{
// freopen("bzoj3224.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&op[i],&t[i].v);
t[i].p=i;
}
sort(t+1,t+1+n,cmp);
ma[a[t[1].p]=++e]=t[1].v;
for(int i=2;i<=n;i++)
{
if(t[i].v!=t[i-1].v) ++e;
ma[a[t[i].p]=e]=t[i].v;
}
for(int i=1;i<=n;i++)
{
if(op[i]==1) Update(a[i],1,1,1,e);
else if(op[i]==2) Update(a[i],-1,1,1,e);
else if(op[i]==3) printf("%d\n",Rank(a[i],1,1,e)+1);
else if(op[i]==4) printf("%d\n",ma[Kth(ma[a[i]],1,1,e)]);
else if(op[i]==5) printf("%d\n",ma[Pre(a[i],1,1,e)]);
else printf("%d\n",ma[Nex(a[i],1,1,e)]);
}
return 0;
【权值线段树】bzoj3224 Tyvj 1728 普通平衡树的更多相关文章
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树
冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...
- BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】
一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...
- cogs 1829. [Tyvj 1728]普通平衡树 权值线段树
1829. [Tyvj 1728]普通平衡树 ★★★ 输入文件:phs.in 输出文件:phs.out 简单对比时间限制:1 s 内存限制:1000 MB [题目描述] 您需要写一种数 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
随机推荐
- 误差曲线(Matlab)
loglog(dof(:),errorestimate(:),:),errorestimate1(:),);hold on; loglog(dof(:),eigvalue(:)-[);%[13.086 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- sscanf与正则表达式(转)
今天翻google reader的时候看到这样一篇文章,介绍的是sscanf的高级用法.直到今天我才知道sscanf是可以直接用正则表达式的,惭愧. 在msdn中sscanf的声明如下 int ssc ...
- oracle job的写法
DECLAREX NUMBER;begin sys.dbms_job.submit(job => x, what => 'begindd_income_risk_control;end;' ...
- ZOJ 1442 Dinner Is Ready 容斥原理 + java大数
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=442 求解 x1 + x2 + x3 + .... + xn = m 其中xi属 ...
- 如何将红色区域数据调用解密函数直接打印到输出控制台(例如:crt控制台)
int main(int argc, char *argv[]) { unsigned char data[PACKET_MAX_LEN]; int data_len = 0; int socket_ ...
- C代码编译成可执行程序的过程
C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc ...
- Zookeeper-Zookeeper可以干什么
在Zookeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, n ...
- SQL注入的原理以及危害
SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符 ...
- 分析‖为什么越来越多厂商开始发力VR一体机?
2015年下半年,国内VR头显市场的主旋律还是PC头显和手机盒子.到了2016年上半年,一体机逐渐上位,成为发布会上的主角. 近期IDEALENS启视在北京召开发布会,发布会的主角K2和K2Pro正是 ...