题目链接

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 ;
}

最新文章

  1. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇
  2. 序列化效率比拼——谁是最后的赢家Newtonsoft.Json
  3. C#串口通讯实例
  4. 自动化-Appium
  5. PHP-递归扫描目录和删除目录
  6. 【转】perl特殊符号及默认的内部变量
  7. 分析java程序中cpu占用过高的线程
  8. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
  9. 将Excel导入到数据中
  10. linux环境设置:使ftp不输密码
  11. python基础课程_学习笔记21:文件和材料
  12. Eclipse汉化后如何还原为EN英文(实用技巧) --转
  13. python 嵌套字典比较值,取值
  14. dict的操作和三级菜单
  15. .Net Core版开源跨平台框架SkyMallCore
  16. XmlDocument.Load(url) url是https远程时,报错&quot; 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。&quot; &quot;根据验证过程,远程证书无效。&quot;
  17. iOS 跳转到系统指定设置界面
  18. iOS中的静态库与动态库,区别、制作和使用
  19. php 函数集锦
  20. CRC标准以及简记式

热门文章

  1. POJ - 2289 Jamie&#39;s Contact Groups (二分图多重匹配)
  2. iOS 多线程安全 与可变数组
  3. Xcode 解决日志打印不全问题
  4. Linux 进程管理 vmstat、top、pstree命令
  5. RPC数据通信
  6. Python3.x:Linux下安装python3.6
  7. MySQLdump增量备份、完全备份与恢复
  8. 探测web服务质量方法
  9. 八步学会数据迁移:ETL工具kettle使用方法
  10. Java 多线程 - 转载