BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)
2024-09-05 12:35:27
treap及树状数组模板题。
treap版:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+,inf=0x7fffffff;
int m,ch[N][],val[N],siz[N],rd[N],tot,rt;
void pu(int u) {siz[u]=siz[ch[u][]]+siz[ch[u][]]+;}
void rot(int& u,int f) {
int v=ch[u][f];
ch[u][f]=ch[v][f^],ch[v][f^]=u;
pu(u),pu(v),u=v;
}
int newnode(int x) {int u=++tot; ch[u][]=ch[u][]=,val[u]=x,siz[u]=,rd[u]=rand(); return u;}
void ins(int& u,int x) {
if(!u) {u=newnode(x); return;}
int f=x>val[u];
ins(ch[u][f],x);
if(rd[ch[u][f]]>rd[u])rot(u,f);
if(u)pu(u);
}
void del(int& u,int x) {
if(val[u]==x) {
if(!ch[u][])u=ch[u][];
else if(!ch[u][])u=ch[u][];
else {
int f=rd[ch[u][]]>rd[ch[u][]];
rot(u,f),del(ch[u][f^],x);
}
} else del(ch[u][x>val[u]],x);
if(u)pu(u);
}
int lb(int u,int x) {
int ret=;
for(; u; u=ch[u][x>val[u]])if(val[u]<x)ret=val[u];
return ret;
}
int ub(int u,int x) {
int ret=;
for(; u; u=ch[u][x>=val[u]])if(val[u]>x)ret=val[u];
return ret;
}
int rnk(int u,int x) {
int ret=;
for(; u; u=ch[u][x>val[u]]) {
if(x>val[u])ret+=siz[ch[u][]]+;
}
return ret+;
}
int kth(int u,int k) {
while(k!=siz[ch[u][]]+) {
if(k<siz[ch[u][]]+)u=ch[u][];
else k-=siz[ch[u][]]+,u=ch[u][];
}
return val[u];
}
int main() {
srand(time());
ins(rt,~inf),ins(rt,inf);
scanf("%d",&m);
while(m--) {
int f,x;
scanf("%d%d",&f,&x);
if(f==)ins(rt,x);
else if(f==)del(rt,x);
else if(f==)printf("%d\n",rnk(rt,x)-);
else if(f==)printf("%d\n",kth(rt,x+));
else if(f==)printf("%d\n",lb(rt,x));
else if(f==)printf("%d\n",ub(rt,x));
}
return ;
}
树状数组版:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+,inf=0x3f3f3f3f;
int m,n,n2,b[N],c[N],Log[N],hb[N];
int lb(int x) {return x&-x;}
void add(int u,int x) {for(; u<=n2; u+=lb(u))c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=lb(u))ret+=c[u]; return ret;}
int kth(int k) {int ret=; for(int i=hb[n2]; i; i>>=)if(ret+i<=n2&&c[ret+i]<k)k-=c[ret+=i]; return ret+;}
struct Q {int f,x;} qr[N];
int main() {
hb[]=;
for(int i=; i<N; ++i)hb[i]=hb[i>>]<<;
scanf("%d",&m);
for(int i=; i<m; ++i)scanf("%d%d",&qr[i].f,&qr[i].x);
for(int i=; i<m; ++i)if(qr[i].f!=)b[n2++]=qr[i].x;
sort(b,b+n2),n2=unique(b,b+n2)-b;
for(int i=; i<m; ++i)if(qr[i].f!=)qr[i].x=lower_bound(b,b+n2,qr[i].x)-b+;
for(int i=; i<m; ++i) {
int f=qr[i].f,x=qr[i].x;
if(f==)add(x,);
else if(f==)add(x,-);
else if(f==)printf("%d\n",get(x-)+);
else if(f==)printf("%d\n",b[kth(x)-]);
else if(f==)printf("%d\n",b[kth(get(x-))-]);
else if(f==)printf("%d\n",b[kth(get(x)+)-]);
}
return ;
}
最新文章
- Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇
- 序列化效率比拼——谁是最后的赢家Newtonsoft.Json
- C#串口通讯实例
- 自动化-Appium
- PHP-递归扫描目录和删除目录
- 【转】perl特殊符号及默认的内部变量
- 分析java程序中cpu占用过高的线程
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 将Excel导入到数据中
- linux环境设置:使ftp不输密码
- python基础课程_学习笔记21:文件和材料
- Eclipse汉化后如何还原为EN英文(实用技巧) --转
- python 嵌套字典比较值,取值
- dict的操作和三级菜单
- .Net Core版开源跨平台框架SkyMallCore
- XmlDocument.Load(url) url是https远程时,报错"; 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。"; ";根据验证过程,远程证书无效。";
- iOS 跳转到系统指定设置界面
- iOS中的静态库与动态库,区别、制作和使用
- php 函数集锦
- CRC标准以及简记式