当前位置: 首页 > news >正文

树套树模板

题目链接

splay


#include <iostream>
#include <algorithm>
using namespace std;#define N 50005
#define INF 2147483647
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]
struct node{int s[2], p;int v, siz;void init(int p1, int v1){p=p1; v=v1; siz=1;}
}tr[N*40];
int n, m, w[N], idx;inline void pushup(int x){tr[x].siz=tr[ls(x)].siz+tr[rs(x)].siz+1;
}
inline void rotate(int x){int y=tr[x].p,z=tr[y].p;int k=tr[y].s[1]==x;tr[z].s[tr[z].s[1]==y]=x, tr[x].p=z;tr[y].s[k]=tr[x].s[k^1], tr[tr[x].s[k^1]].p=y;tr[x].s[k^1]=y, tr[y].p=x;pushup(y), pushup(x);
}
inline void splay(int &root,int x,int k){while(tr[x].p != k){int y=tr[x].p,z=tr[y].p;if(z != k)if((rs(y)==x)^(rs(z)==y)) rotate(x);else rotate(y);rotate(x);}if(!k) root=x;
}
inline void insert(int &root,int v){int u=root,p=0;while(u) p=u,u=tr[u].s[v>tr[u].v];u = ++idx;tr[p].s[v>tr[p].v]=u;tr[u].init(p,v);splay(root,u,0);
}
inline void del(int &root,int v){int u=root;while(u){if(tr[u].v==v) break;if(tr[u].v<v) u=rs(u);else u=ls(u);}splay(root,u,0);int l=ls(u),r=rs(u);while(rs(l)) l=rs(l);while(ls(r)) r=ls(r);splay(root,l,0);splay(root,r,l);ls(r)=0;splay(root,r,0);
}
inline int getrank(int root,int v){int u=root,res=0;while(u){if(tr[u].v<v) res+=tr[ls(u)].siz+1,u=rs(u);else u=ls(u);}return res;
}
inline int getpre(int root,int v){int u=root,res=-INF;while(u){if(tr[u].v<v) res=tr[u].v,u=rs(u);else u=ls(u);}return res;
}
inline int getnxt(int root,int v){int u=root,res=INF;while(u){if(tr[u].v>v) res=tr[u].v,u=ls(u);else u=rs(u);}return res;
}//线段树
#define lc u<<1
#define rc u<<1|1
int root[N*4];void build(int u,int l,int r){insert(root[u],-INF), insert(root[u],INF);for(int i=l;i<=r;i++)insert(root[u],w[i]);if(l==r) return;int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);
}
int queryrank(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getrank(root[u],v)-1;int mid=l+r>>1, res=0;if(x<=mid) res += queryrank(lc,l,mid,x,y,v);if(y>mid) res += queryrank(rc,mid+1,r,x,y,v);return res;
}
int queryval(int u,int x,int y,int k){int l=0, r=1e8, ans; //二分while(l<=r){int mid=l+r>>1;if(queryrank(1,1,n,x,y,mid)+1<=k) l=mid+1, ans=mid;else r=mid-1;}return ans;
}
void change(int u,int l,int r,int pos,int v){del(root[u],w[pos]);insert(root[u],v);if(l==r) return;int mid=l+r>>1;if(pos<=mid) change(lc,l,mid,pos,v);else change(rc,mid+1,r,pos,v);
}
int querypre(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getpre(root[u],v);int mid=l+r>>1, res=-INF;if(x<=mid) res=max(res,querypre(lc,l,mid,x,y,v));if(y>mid) res=max(res,querypre(rc,mid+1,r,x,y,v));return res;
}
int querynxt(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getnxt(root[u],v);int mid=l+r>>1, res=INF;if(x<=mid) res=min(res,querynxt(lc,l,mid,x,y,v));if(y>mid) res=min(res,querynxt(rc,mid+1,r,x,y,v));return res;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&w[i]);build(1,1,n);while(m -- ){int op,x,y,v;scanf("%d",&op);if(op==3)scanf("%d%d",&x,&v);else scanf("%d%d%d",&x,&y,&v);if(op==1)printf("%d\n",queryrank(1,1,n,x,y,v)+1);if(op==2) printf("%d\n",queryval(1,x,y,v));if(op==3)change(1,1,n,x,v), w[x]=v;if(op==4)printf("%d\n",querypre(1,1,n,x,y,v));if(op==5)printf("%d\n",querynxt(1,1,n,x,y,v));}return 0;
}

fhq treap

#include <iostream>
#include <algorithm>
using namespace std;const int N=2000005;
const int INF=0x7fffffff;
int n,m,w[N],idx;
int l[N],r[N],val[N],rnd[N],siz[N];inline void newnode(int &x,int v){x=++idx;val[x]=v;rnd[x]=rand();siz[x]=1;
}   
inline void pushup(int x){siz[x]=siz[l[x]]+siz[r[x]]+1;
}
inline void split(int p,int v,int &x,int &y){if(!p){x=y=0; return;}if(val[p]<=v)x=p, split(r[p],v,r[p],y);elsey=p, split(l[p],v,x,l[p]);pushup(p);
}
inline int merge(int x,int y){if(!x || !y) return x+y;if(rnd[x] < rnd[y]){r[x]=merge(r[x],y);pushup(x); return x;}else{l[y]=merge(x,l[y]);pushup(y); return y;} 
}
inline void insert(int &root,int v){int x,y,z;split(root,v,x,y);newnode(z,v);root=merge(merge(x,z),y);
}
inline void del(int &root,int v){int x,y,z;split(root,v,x,z);split(x,v-1,x,y);y=merge(l[y],r[y]);root=merge(x,merge(y,z));
}
inline int getrank(int &root,int v){int x,y,z,ans;split(root,v-1,x,y);ans=siz[x]+1;root=merge(x,y);return ans;
}
inline int getval(int x,int k){if(k==siz[l[x]]+1) return val[x];  if(k<=siz[l[x]]) return getval(l[x],k);return getval(r[x],k-siz[l[x]]-1);
}
inline int getpre(int &root,int v){int x,y,z,ans;split(root,v-1,x,y);ans = siz[x]?getval(x,siz[x]):-INF;root = merge(x,y);return ans;
}
inline int getnxt(int &root,int v){int x,y,z,ans;split(root,v,x,y);ans = siz[y]?getval(y,1):INF;root = merge(x,y);return ans;
}// 线段树
#define lc (u<<1)
#define rc (u<<1|1)
int root[N];void build(int u,int l,int r){for(int i=l;i<=r;i++) insert(root[u],w[i]);if(l==r) return;int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);
}
int queryrank(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getrank(root[u],v)-1;int mid=l+r>>1,res=0;if(x<=mid) res += queryrank(lc,l,mid,x,y,v);if(y>mid) res += queryrank(rc,mid+1,r,x,y,v);return res;
}
int queryval(int u,int x,int y,int v){int l=0,r=1e8,ans; //二分while(l<=r){int mid=l+r>>1;if(queryrank(1,1,n,x,y,mid)+1<=v) ans=mid, l=mid+1;else r=mid-1;}return ans;
}
void change(int u,int l,int r,int p,int v){del(root[u],w[p]);insert(root[u],v);if(l==r) return;int mid=l+r>>1;if(p<=mid) change(lc,l,mid,p,v);else change(rc,mid+1,r,p,v);
}
int querypre(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getpre(root[u],v);int mid=l+r>>1,res=-INF;if(x<=mid) res=max(res,querypre(lc,l,mid,x,y,v));if(y>mid) res=max(res,querypre(rc,mid+1,r,x,y,v));return res;
}
int querynxt(int u,int l,int r,int x,int y,int v){if(x<=l && r<=y) return getnxt(root[u],v);int mid=l+r>>1,res=INF;if(x<=mid) res=min(res,querynxt(lc,l,mid,x,y,v));if(y>mid) res=min(res,querynxt(rc,mid+1,r,x,y,v));return res;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&w[i]);build(1,1,n);while(m -- ){int op,x,y,v;scanf("%d",&op);if(op==3)scanf("%d%d",&x,&v);else scanf("%d%d%d",&x,&y,&v);if(op==1)printf("%d\n",queryrank(1,1,n,x,y,v)+1);if(op==2) printf("%d\n",queryval(1,x,y,v));if(op==3)change(1,1,n,x,v), w[x]=v;if(op==4)printf("%d\n",querypre(1,1,n,x,y,v));if(op==5)printf("%d\n",querynxt(1,1,n,x,y,v));}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PYTHON专题-(5)类的专有方法
  • 每日学术速递8.3
  • Xilinx管脚验证流程及常见问题
  • conda环境pip 安装Tensorflow-gpu 2.10.2提示nbconvert 的包依赖冲突
  • OpenStack Yoga版安装笔记(十二)nova安装(下)
  • 林轩田机器学习基石——笔记1.2 Learn to Answer Yes/No(如何进行学习)
  • Flink 实时数仓(二)【DIM 层搭建】
  • 中介子方程七十九
  • Apache Kylin数据模型设计:从ETL到多维分析
  • 自闭症儿童无法上学?专业康复机构是希望的灯塔
  • OpenCV Python 图像相加与透明色转换
  • Day13--JavaWeb学习之Servlet后端渲染界面
  • 算法学习day28
  • VBA学习(22):动态显示日历
  • 网页UI设计工具全攻略:九大精选
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2017-08-04 前端日报
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • es6(二):字符串的扩展
  • extract-text-webpack-plugin用法
  • flask接收请求并推入栈
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • overflow: hidden IE7无效
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • tab.js分享及浏览器兼容性问题汇总
  • 机器学习学习笔记一
  • 收藏好这篇,别再只说“数据劫持”了
  • AI算硅基生命吗,为什么?
  • 大数据全解:定义、价值及挑战
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #、%和$符号在OGNL表达式中经常出现
  • #define,static,const,三种常量的区别
  • #pragma 指令
  • #微信小程序(布局、渲染层基础知识)
  • ${factoryList }后面有空格不影响
  • (¥1011)-(一千零一拾一元整)输出
  • (1)Jupyter Notebook 下载及安装
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (a /b)*c的值
  • (C语言)球球大作战
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (定时器/计数器)中断系统(详解与使用)
  • (二) 初入MySQL 【数据库管理】
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)进入MySQL 【事务】
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .bat批处理(七):PC端从手机内复制文件到本地