技术标签: 平衡树
传送门
看了一圈,好像真的没什么用指针的呢。。
明明觉得指针很好看(什么??你说RE???听不见听不见)
其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就不知道咋回事了,是不是很有道理,虽然我还是调了几小时
我写的是fhq treap,核心是split和merge操作,思想高赞dalao都讲得很清楚,我语文弱渣就不班门弄斧了,主要是想提供一个指针版的参考吧QAQ
我真的是一整天都在搞分裂(split),有种要进入七月枪毙名单的赶脚,慌张.jpg
#include<bits/stdc++.h>
#define LL long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=100005;
struct node{
int v,rnd,s,sz; //s表示权值为v的个数,sz表示子树size,然而我经常忘记s的存在,直接写成1,挂了好久
node* ch[2];
inline int cmp(int x){
return x>v; } //这其实是写旋转treap时留下的历史遗留问题= =无视吧
inline void maintain(){
sz=s;
if (ch[0]!=NULL) sz+=ch[0]->sz; //写指针一定要特别注意对NULL的判断
if (ch[1]!=NULL) sz+=ch[1]->sz;
}
node(){
ch[0]=ch[1]=NULL;
rnd=rand();
}
}nd[N];
int tot;
node* rt;
int n;
void read(int &x){
//读优一开始忘记负数了= =
char ch=getchar();x=0;int w=0;
for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
if (w) x=-x;
}
inline int sss(node* &o){
return o==NULL?0:o->sz;
}
node* &kth(node* &o,int k){
assert(o!=NULL);
int s=sss(o->ch[0]);
if (s+1<=k&&s+o->s>=k) return o;
if (s+1>k) return kth(o->ch[0],k);
return kth(o->ch[1],k-o->s-s);
}
void split(node* o,node* &L,node* &r,int k){
//split <=k
if (o==NULL) return L=r=NULL,void();
if (o->v<=k){
split(o->ch[1],o->ch[1],r,k);
L=o;
} else{
split(o->ch[0],L,o->ch[0],k);
r=o;
}
o->maintain(); //要经常维护一下信息
}
node* &merge(node* &L,node* &r){
if (L==NULL) return r;
if (r==NULL) return L;
if (L->rnd<r->rnd){
L->ch[1]=merge(L->ch[1],r);
L->maintain();
return L;
} else{
r->ch[0]=merge(L,r->ch[0]);
r->maintain();
return r;
}
}
void add_node(int v){
node* L;
node* r;node* xx;
split(rt,L,r,v);
if (L!=NULL&&(xx=kth(L,L->sz))->v==v){
//如果存在这个数直接加个数
split(L,L,xx,v-1);
xx->s++;xx->sz++; //不要忘记加size
//rt=merge(L,r);
}else{
xx=&nd[++tot];
xx->s=xx->sz=1;xx->v=v;
}
rt=merge(merge(L,xx),r);
}
void del_node(int v){
node *L,*r,*mid;
split(rt,L,r,v-1);
split(r,mid,r,v);
if (mid!=NULL&&mid->s>1) mid->s--,mid->sz--,r=merge(mid,r);
rt=merge(L,r);
}
int rk(node* &o,int v){
assert(o!=NULL);
if (o->v==v) return sss(o->ch[0])+1;
if (v<o->v) return rk(o->ch[0],v);
else return rk(o->ch[1],v)+sss(o->ch[0])+o->s;
}
int rkk(node* rt,int v){
node *L,*r;
split(rt,L,r,v-1);
int ans=sss(L)+1;
rt=merge(L,r);
return ans;
}
//rk和rkk都可以求rank,一个通过split一个通过size,好像rkk更快?感觉有点奇怪...
int main(){
srand(19260817);
read(n);
int tp,x;
node *L,*r;
int s=0;
add_node(19260817);
fr(o,1,n){
read(tp);read(x);
if (tp==1) add_node(x);
if (tp==2) del_node(x);
if (tp==3) printf("%d\n",rk(rt,x)),s++;
if (tp==4) printf("%d\n",kth(rt,x)->v),s++;
if (tp==5){
split(rt,L,r,x-1);
printf("%d\n",kth(L,L->sz)->v),s++;
rt=merge(L,r);
}
if (tp==6){
split(rt,L,r,x);
printf("%d\n",kth(r,1)->v),s++;
rt=merge(L,r);
}
//if (s==670) printf("----%d %d %d\n",o,tp,x);
}
return 0;
}
AppDelegate中一些常用方法:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ NSLog(@"启动程序,didFinishLaunchingWithOptions"); return Y...
card.png: mode.png:结果:
《弗兰克-赫兹实验实验报告》由会员分享,可在线阅读,更多相关《弗兰克-赫兹实验实验报告(4页珍藏版)》请在人人文库网上搜索。1、实验目的 通过测定汞原子的第一激发电位,证明原子能级存在。二实验原理1激发电势玻尔的原子能级理论(1) 原子只能长时间的停留在一些稳定的状态,(简称定态)。原子在这些状态时, 不发射或吸 收能量;各定态有一定的能量,其数值是彼此分隔的。原子的能量不论通过什么方式发生改变,...
文字显示太长 ,超出隐藏,省略号显示 css代码1.app页面文字过长2.超出隐藏css代码: width: 280rpx; white-space: nowrap; //不换行 overflow: hidden; //超出隐藏 text-overflow: ellipsis; //文本超出,用ellipsis省略号3.多行显示,用点点代替css代码: //width: 280rpx; //自己定宽度 //white-space: nowrap; //需要
域名解析绑定到服务器指定端口域名绑定服务器,通常默认的是80端口 server { listen 80; server_name localhost; location / { root html/xxx; index index.html index.htm; } }那...
PHP开源IT类资产管理系统方法如下:前提:首先需要三个东西:APACHE,PHP5,SQLITE3,php5-sqlite,各种APT-GET。从他们的网站上下载一个软件包,TAR 就好了。放到APACHE目录下,分给里面的DATA这个目录WWW-DATA的`权限和777的权限。若发现访问不了,提示缺少数据库的驱动。就把php5-adodb 再次apt-get。1、安装itdb需求的环境sudo...
在没有硬件防火墙的前提下,Linux系统也提供了很完善的防火墙策略Iptable,同样能胜任防火墙的策略,但由于规则负责的原因很少被使用。我总结一下iptable的使用方法。通常防火墙策略配置文件所在的路径为/etc/sysconfig/iptables#Generatedbyiptables-savev1.4.7onWedApr813:50:4920...
private static X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1"); private static ECDomainParameters ecDomainParameters = new ECDomainParameters(x9ECParameters.getCurve(), x9ECPa...
springboot 自动配置是怎么样的在用springboot搭建项目的时候整合其他框架mybatis,很方便快捷。不需要我们以前那样编写一大堆的配置文件,只写了极少的配置。那么boot自动配置是怎么实现的呢?在spirngboot应用引导类,也就是main方法可以看到程序的实现:SpringApplication.run();这个run方法的内部其实就是帮我们创建了一个spring容器,创建好后会刷新一次这个spring容器。在刷新的同时,我们springboot引导类上的注解@Spr.
今天下午想在Linux中用命令直接搭建PHP+Mysql+Apache时才发现前不久装的Kali下没有yum源,一时也忘了安装yum的命令是啥了 后来百度了一下才想起来……在这里顺便把一些其他的工具安装命令列一下:apt-get install gnome-tweak-tool #安装gnome管理软件apt-get install software-cent
I:安装包版本及下载a.安装包:Ogg version:121210_ggs_Windows_x64_shiphome.zipOracle version:win64_11gR2_databaseb.下载ogg最新版本:--》downloads--&gtmiddleware--&gtgoldengate--&gtAcceptLicenseAgreement 勾上同意12cw...
这篇文章主要介绍了Vue+ElementUI实现表单动态渲染、可视化配置的方法,需要的朋友可以参考下动态渲染就是有一个异步的数据,大概长这样:{"inline": true,"labelPosition": "right","labelWidth": "","size": "small","statusIcon": true,"formItemList": [{"type": "input","l...