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

Splay基础

先放我的Splay板子

#include <bits/stdc++.h>
using namespace std;
const int inf=1e9;
int n,root,tot;
struct splay{int ch[3],val,cnt;int size,fa;
}a[1000010];
void Update(int p){a[p].size=a[a[p].ch[0]].size+a[a[p].ch[1]].size+a[p].cnt;
}
void Rotate(int x){int y=a[x].fa;int z=a[y].fa;int kid=a[y].ch[1]==x;a[z].ch[a[z].ch[1]==y]=x;a[x].fa=z;a[y].ch[kid]=a[x].ch[kid^1];a[a[x].ch[kid^1]].fa=y;a[x].ch[kid^1]=y;a[y].fa=x;Update(y);Update(x);return ;
}
void Splay(int x,int goal){while(a[x].fa!=goal){int y=a[x].fa;int z=a[y].fa;if(z!=goal){(a[z].ch[0]==y)^(a[y].ch[0]==z)?Rotate(x):Rotate(y);}Rotate(x);}if(goal==0){root=x;}return ;
}
void Insert(int val){int now=root,fa=0;while(a[now].val!=val&&now){fa=now;now=a[now].ch[a[now].val<val];}if(now){a[now].cnt+=1;}else{now=++tot;if(fa){a[fa].ch[a[fa].val<val]=now;a[now].fa=fa;}a[tot].val=val;a[now].size=a[now].cnt=1;}Splay(now,0);
}
void Search(int val){int now=root;if(!now){return ;}while(now&&a[now].val!=val){now=a[now].ch[a[now].val<val];}Splay(now,0);
}
int GetValByRank(int p,int rank){if(!p){return 0;}if(a[a[p].ch[0]].size>=rank){return GetValByRank(a[p].ch[0],rank);}if(a[a[p].ch[0]].size+a[p].cnt>=rank){return a[p].val;}return GetValByRank(a[p].ch[1],rank-a[a[p].ch[0]].size-a[p].cnt);
}
int GetPre(int val){Search(val);int pos=a[root].ch[0];while(a[pos].ch[1]){pos=a[pos].ch[1];}return pos;
}
int GetNext(int val){Search(val);int pos=a[root].ch[1];while(a[pos].ch[0]){pos=a[pos].ch[0];}return pos;
}
void Remove(int x){int pre_x=GetPre(x);int nxt_x=GetNext(x);Splay(pre_x,0);Splay(nxt_x,pre_x);int pos=a[root].ch[1];if(a[a[pos].ch[0]].cnt>1){a[a[pos].ch[0]].cnt--;Update(nxt_x);Update(pre_x);Splay(a[pos].ch[0],0);return ;}a[pos].ch[0]=0;Update(nxt_x);Update(pre_x);return ;
}
signed main(){ios::sync_with_stdio(0);cin>>n;Insert(-inf);Insert(inf);for(int i=1;i<=n;i++){int opt,x;cin>>opt>>x;if(opt==1){Insert(x);}if(opt==2){Remove(x);}if(opt==3){Insert(x);Search(x);cout<<a[a[root].ch[0]].size<<endl;Remove(x);}if(opt==4){cout<<GetValByRank(root,x+1)<<endl;}if(opt==5){Insert(x);cout<<a[GetPre(x)].val<<endl;Remove(x);}if(opt==6){Insert(x);cout<<a[GetNext(x)].val<<endl;Remove(x);}}
}
/*
您需要动态地维护一个可重集合 M,并且提供以下操作:向 M 中插入一个数 x。
从 M 中删除一个数 x(若有多个相同的数,应只删除一个)。
查询 M 中有多少个数比 x 小,并且将得到的答案加一。
查询如果将 M 从小到大排列后,排名位于第 x 位的数。
查询 M 中 x 的前驱(前驱定义为小于 x,且最大的数)。
查询 M 中 x 的后继(后继定义为大于 x,且最小的数)。
对于操作 3,5,6,不保证当前可重集中存在数 x。对于操作 5,6,保证答案一定存在。输入格式
第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x,opt 表示操作的序号(1≤opt≤6)。输出格式
对于操作 3,4,5,6 每行输出一个数,表示对应答案。
*/

5831bfb9d72bcb01f53b5694affdd6c7

 

http://www.jsqmd.com/news/397448/

相关文章:

  • 基于python的电影数据可视化
  • 深度对比:传统系统vs AI智能体系统在企业数字化转型中的优劣势
  • 【系统分析师】9.5 容灾与业务持续
  • 杰理之蓝牙连接后进入sniff断开连接的问题【篇】
  • AI原生应用中情境感知的数据处理技巧
  • 论文降重神器推荐:7款AI工具排名,轻松优化内容,提高通过率。
  • 7种AI降重方法解析,帮你解决论文重复问题,确保顺利发表。
  • 教育资源AI智能分配,构建智能化教育环境
  • 情感分析模型部署实战:Flask+Docker+云服务
  • 7种AI降重技术盘点,助力学术论文顺利过关,提升内容质量。
  • 数据湖数据脱敏技术:静态脱敏vs动态脱敏,工具与实践
  • 7个高效AI降重工具,让你的论文快速达标,避免重复率问题。
  • 基于Python的可视化教学作业教育在线学习资源系统
  • 多模态AI模型应用:架构师必须知道的部署和运维策略
  • Rulial Space的核心逻辑链
  • 基于Django的二手电子设备商城交易平台设计与开发
  • 闲置物美卡别浪费!3种靠谱物美卡回收方法,轻松盘活闲置资产 - 京回收小程序
  • 题解:P11982 [KTSC 2021] 路灯 / streetlight
  • 基于Django鲜花花卉商城自动下单订花系统的设计与实现
  • 基于Python Web的社区爱心养老图书借阅管理系统设计与实现
  • 基于python的白酒数据推荐系统
  • 深入理解限流:从原理、算法到实践,一文吃透
  • 基于Django的个性化餐饮美食预订管理系统
  • 如果你需要涉及一个将已登录的用户踢下线的功能,你会如何实现?
  • ChatGH 介绍
  • 论文降重必备!7款AI工具排名,帮你快速优化内容,提高通过率。
  • 论文写作利器:7大AI网站排名及改写技巧详解。
  • Andrew Stankevich Contest 46 总结
  • 掌握这7种AI降重技巧,轻松提升论文通过率,让你的学术成果顺利达标。
  • 7大AI降重方法推荐,高效优化论文内容,确保学术成果顺利通过审核。