P3369-[模板]普通平衡树【Splay】

正题

评测记录:https://www.luogu.org/recordnew/lists?uid=SSL_WYC_zombieeeeee&pid=P3369&status=&sort=0


题目大意

要求支持查询一个数字的排名,查询该排名的数字,插入数字,删除数字,求前驱后继。


解题思路

Splay不解释。


codecodecode

#include<cstdio>
#include<algorithm>
#define INF 2100000000
#define N 100010
using namespace std;
struct splay{int v[N],father[N];int l[N],r[N];int sum[N],recy[N];int n,points;#define root r[0]void Updata(int x){sum[x]=sum[l[x]]+sum[r[x]]+recy[x];}int Identify(int x){return l[father[x]]==x?0:1;}void Connect(int x,int f,int son){father[x]=f;if(son) r[f]=x;else l[f]=x;}void Rotate(int x){int y=father[x];int mroot=father[y];int mrootson=Identify(y);int yson=Identify(x);int B=(yson?l[x]:r[x]);Connect(B,y,yson);Connect(y,x,(yson^1));Connect(x,mroot,mrootson);Updata(y);Updata(x);}void Splay(int at,int to){to=father[to];while(father[at]!=to){int up=father[at];if(father[up]==to) Rotate(at);else if(Identify(up)==Identify(at)){Rotate(up);Rotate(at);}else{Rotate(at);Rotate(at);}}}int CrePoint(int vs,int fathers){n++;v[n]=vs;father[n]=fathers;sum[n]=recy[n]=1;return n;}void Destory(int x){v[x]=l[x]=r[x]=sum[x]=father[x]=recy[x]=0;if(x==n)n--;}int getroot(){return root;}int FindVal(int vs){int now=root;if(!now) return 0;while(true){if(v[now]==vs){Splay(now,root);return root;}int next=vs<v[now]?0:1;if(!(next?r[now]:l[now])) return 0;now=(next?r[now]:l[now]);}}int Build(int vs){points++;if(!n){root=1;CrePoint(vs,0);}else{int now=root;while(1){sum[now]++;if(vs==v[now]){recy[now]++;return now;}int next=vs<v[now]?0:1;if(!(next?r[now]:l[now])){CrePoint(vs,now);if(next) r[now]=n;else l[now]=n;return n;}now=next?r[now]:l[now];}}return 0;}void Insert(int vs){int add=Build(vs);Splay(add,root);}void Remove(int vs){int deal=FindVal(vs);if(!deal) return;points--;if(recy[deal]>1){recy[deal]--;sum[deal]--;return;}if(!l[deal]){root=r[deal];father[root]=0;}else{int lef=l[deal];while(r[lef]) lef=r[lef];Splay(lef,l[deal]);int rig=r[deal];Connect(rig,lef,1);Connect(lef,0,1);Updata(lef);}Destory(deal);}int GetRankByVal(int vs){int now=root;if(!now) return 0;while((vs>v[now]?r[now]:l[now])&&vs!=v[now])now=(vs>v[now]?r[now]:l[now]);Splay(now,root);return sum[l[root]];}int GetValByRank(int x){if(x>points) return -INF;int now=root;while(1){int minused=sum[now]-sum[r[now]];if(x>sum[l[now]]&&x<=minused) break;if(x<minused)now=l[now];else{x-=minused;now=r[now];}}Splay(now,root);return v[now];}int Upper(int vs){int now=root;int result=INF;while(now){if(v[now]>vs&&v[now]<result) result=v[now];if(vs<v[now]) now=l[now];else now=r[now];}return result;}int Lower(int vs){int now=root;int result=-INF;while(now){if(v[now]<vs&&v[now]>result) result=v[now];if(vs>v[now]) now=r[now];else now=l[now];}return result;}#undef root
}a;
int main(){freopen("testdata.in","r",stdin);freopen("data.out","w",stdout);a.Insert(-INF);a.Insert(INF);int m;scanf("%d",&m);while(m--){int opt,x;scanf("%d%d",&opt,&x);if(opt==1) a.Insert(x);if(opt==2) a.Remove(x);if(opt==3) printf("%d\n",a.GetRankByVal(x));if(opt==4) printf("%d\n",a.GetValByRank(x+1));if(opt==5) printf("%d\n",a.Lower(x));if(opt==6) printf("%d\n",a.Upper(x));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于.NET CORE微服务框架 -浅析如何使用surging

1、前言 surging受到大家这么强烈的关注&#xff0c;我感到非常意外&#xff0c;比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架&#xff0c;微服务做对比等等&#xff0c;这些举动都让我感觉压力很大&#xff0c;毕竟作为个人的开源项目&#xff0c;无法与…

C++描述杭电OJ 2016.数据的交换输出 ||

C描述杭电OJ 2016.数据的交换输出 || Problem Description 输入n(n<100)个数&#xff0c;找出其中最小的数&#xff0c;将它与最前面的数交换后输出这些数。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的开始是一个整数n&#xff0c;表示这个测试实例的…

2019年这50个Kafka面试题,你知道答案么

转载自 2019年这50个Kafka面试题&#xff0c;你知道答案么 Apache Kafka对于新手的面试问题&#xff1a;41, 42, 43, 44, 45, 47, 49 Apache Kafka对于有经验的人的面试问题&#xff1a;46, 48 Apache Kafka的受欢迎程度很高&#xff0c;Kafka拥有充足的就业机会和职业前景…

聊天系统

显示所有的信息 chat.html <!DOCTYPE html><html> <head> <meta charset"UTF-8"><title></title><style>#button1{background:skyblue;border-radius:20px;width:100px;}</style><script>function showmess…

jzoj3058-火炬手【高精度,暴力】

正题 题目大意 对于一个nnn&#xff0c;求一个mmm&#xff0c;使得n∗mn*mn∗m只有0或1 解题思路 暴力枚举n∗mn*mn∗m&#xff0c;然后高精度求答案。 codecodecode #include<cstdio> #include<cmath> #define ll long long using namespace std; ll n,xans; i…

使用Visual Studio Code 开发.NET Core应用程序

开源和跨平台开发是Microsoft 的当前和将来至关重要的策略。.NET Core已开源&#xff0c;同时开发了其他项来使用和支持新的跨平台策略。.NET Core2.0 目前已经发布&#xff0c;是适用于针对 Web 和云构建跨平台应用程序的最新开源技术&#xff0c;可在 Linux、Mac OS X 和Wind…

C++描述杭电OJ 2018.母牛的故事 ||

C描述杭电OJ 2018.母牛的故事 || Problem Description 有一头母牛&#xff0c;它每年年初生一头小母牛。每头小母牛从第四个年头开始&#xff0c;每年年初也生一头小母牛。请编程实现在第n年的时候&#xff0c;共有多少头母牛&#xff1f; Input 输入数据由多个测试实例组成…

Kafka面试题与答案全套整理

转载自 Kafka面试题与答案全套整理 1. Kafka的用途有哪些&#xff1f;使用场景如何&#xff1f; 总结下来就几个字:异步处理、日常系统解耦、削峰、提速、广播 如果再说具体一点例如:消息,网站活动追踪,监测指标,日志聚合,流处理,事件采集,提交日志等 2. Kafka中的ISR、AR又…

jzoj3059-雕塑【容斥,数论】

正题 题目大意 n∗nn*nn∗n的矩阵&#xff0c;要求放nnn个雕塑&#xff0c;要求每行每列都只有一个雕塑&#xff0c;且不可以放在障碍物上。求方案总数。 解题思路 首先没有障碍物答案就是n!n!n!。 之后障碍物很少&#xff0c;考虑容斥。 设fif_ifi​为选iii个障碍物且这些障…

Julia女神告诉我任何一家企业本质上都是一家软件公司

微软技术大会今天进入高潮&#xff0c;潘正磊女神发表题为“开发者在数字化转型中的关键价值”的主题演讲&#xff0c;积极评价开发者在各行业数字化转型中扮演的关键角色&#xff1b; 女神潘正磊表示&#xff1a;“由技术创新引领的数字化转型给全球各行业带来了巨大的变革和机…

C++描述杭电OJ 2020.绝对值排序 ||

C描述杭电OJ 2020.绝对值排序 || Problem Description 输入n(n<100)个整数&#xff0c;按照绝对值从大到小排序后输出。题目保证对于每一个测试实例&#xff0c;所有的数的绝对值都不相等。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数字为n…

P3391-[模板]文艺平衡树【Splay】

正题 题目连接:https://www.luogu.org/problemnew/show/P3391 题目大意 一个序列&#xff0c;m个操作翻转[l..r][l..r][l..r]区间。求最终序列 解题思路 节点维护编号&#xff0c;然后答案就是中序遍历。然后翻转的话我们先考虑一个性质。 若这是初始状态(l-1和r1反了) 然后…

响应式布局(手机端)

禁止手机页面放大缩小 <meta name"viewport" content"widthdevice-width,minimum-scale1.0,maximum-scale1.0,user-scalableno" />media screen and(max-width: 750px){} <!DOCTYPE html> <html> <head><title></title…

Hadoop入门(三)HDFS API

一、、HDFS 常用类 Configuration 配置 Path 路径 FileSystem 文件系统 Stream 流 IOUtils IO工具 API文档 二、类解析 &#xff08;1&#xff09;Configuration 配置文件加载顺序 设置/获取参数方法 &#xff08;2&#xff09;Path Path 常用方法 &#xff08;3&…

在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

最近在做一个项目的单元测试时&#xff0c;遇到了些问题&#xff0c;解决后&#xff0c;觉得有必要记下来&#xff0c;并分享给需要的人&#xff0c;先简单说一下项目技术框架背景&#xff1a; asp.net core 2.0(for .net core)框架 用Entity Framework Core作ORM XUnit作单元…

idea中pom.xml文件横线解决办法

解决方案&#xff1a; file >>> settings >>> Build,Execution,Deployment >>> Build Tools >>> Maven >>> Ignored Files 右边带勾的取消&#xff0c;然后应用即可&#xff01;

P1311,jzoj3025-选择客栈【统计】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1311 题目大意 如果两个客栈是同样颜色且中间有客栈消费不超过p那么久算为一种方案&#xff0c;求方案总数 解题思路 先枚举颜色&#xff0c;然后枚举右边的&#xff0c;对于左边&#xff0c;记录两…

解决idea中xml文件报红问题

报错截图&#xff1a; 解决方法&#xff1a; 复制爆红的约束链接file >>> settings >>> Languages & Frameworks >>> Schemas and DTDs右边框中找到 Ignored schemas and DTD3:点击加号添加约束&#xff0c;如下图应用即可&#xff01;

Hadoop入门(四)HDFS编程

一、编程环境设置 编程使用到idea2018&#xff0c;maven &#xff08;1&#xff09;启动集群 在window上启动vmware软件的虚拟机hadoop01&#xff0c;hadoop02&#xff0c;hadoop03。 进入hadoop01虚拟机启动集群&#xff0c;执行命令 start-dfs.sh &#xff08;2&#x…

ASP.NET Core 认证与授权[4]:JwtBearer认证

Bearer认证 HTTP提供了一套标准的身份验证框架&#xff1a;服务器可以用来针对客户端的请求发送质询(challenge)&#xff0c;客户端根据质询提供身份验证凭证。质询与应答的工作流程如下&#xff1a;服务器端向客户端返回401&#xff08;Unauthorized&#xff0c;未授权&#x…