treap改了好长时间,erase写错了。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int inf=<<;
int n,mn,root,delta,tot,leave;
int key[],cnt[],size[],p[];
int child[][];
void update(int x)
{
size[x]=size[child[x][]]+size[child[x][]]+cnt[x];
}
void rotate(int&x,int t)
{
int y=child[x][t];
child[x][t]=child[y][-t];
child[y][-t]=x;
update(x);
update(y);
x=y;
}
void insert(int&x,int k)
{
if(x)
{
if(key[x]==k)
{
cnt[x]++;
update(x);
return;
}
int t=key[x]<k;
insert(child[x][t],k);
if(p[x]<p[child[x][t]]) rotate(x,t);
update(x);
}
else
{
tot++;
x=tot;
p[x]=rand();
key[x]=k;
cnt[x]=;
update(x);
}
}
void erase(int&x,int k)
{
if(key[x]==k)
{
if(!child[x][]&&!child[x][])
{
x=;
return;
}
int t=p[child[x][]]>p[child[x][]];
rotate(x,t);
erase(child[x][t^],k);
} else erase(child[x][key[x]<k],k);
update(x);
}
void _erase(int x)
{
if(x==) return;
if(key[x]+delta<mn)
{
leave+=cnt[x];
if(key[child[x][]]+delta<mn)
{
leave+=size[child[x][]];
child[x][]=;
update(x);
}
_erase(child[x][]);
erase(root,key[x]);
}
_erase(child[x][]);
}
int find(int x,int k)
{
if(k<=size[child[x][]])
return find(child[x][],k);
k-=size[child[x][]]+cnt[x];
if(k<=)
return key[x];
return find(child[x][],k);
}
int main()
{
p[]=-inf;
scanf("%d%d",&n,&mn);
while(n--)
{
char s[]; int k; scanf("%s%d",s,&k);
if(s[]=='I')
{
if(k>=mn)
insert(root,k-delta);
}
if(s[]=='A')
{
delta+=k;
}
if(s[]=='S')
{
delta-=k;
_erase(root);
}
if(s[]=='F')
{
if(k>size[root]) printf("-1\n"); else
printf("%d\n",find(root,k)+delta);
}
}
printf("%d\n",leave);
return ;
}

splay

#include<cstdio>
#include<cstring>
using namespace std;
struct data
{
int fa,l,r,size,cnt,key;
}tree[];
int root,n,tot,ans;
int abs(int x)
{
return x>?x:-x;
}
void update(int x)
{
tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+tree[x].cnt;
}
void zig(int x)
{
int y=tree[x].fa;
int z=tree[x].r;
tree[y].l=z;
tree[z].fa=y;
tree[x].fa=tree[y].fa;
if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
else tree[tree[y].fa].r=x;
tree[x].r=y;
tree[y].fa=x;
update(x);
update(y);
}
void zag(int x)
{
int y=tree[x].fa;
int z=tree[x].l;
tree[y].r=z;
tree[z].fa=y;
tree[x].fa=tree[y].fa;
if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
else tree[tree[y].fa].r=x;
tree[x].l=y;
tree[y].fa=x;
update(x);
update(y);
}
void splay(int x)
{
if(!root)
{
root=x;
return;
}
while(tree[x].fa)
{
int y=tree[x].fa;
int z=tree[y].fa;
if(y==root)
{
if(x==tree[root].l) zig(x); else zag(x);
update(x);
break;
}
else if(y==tree[z].l&&x==tree[y].l) {zig(y); zig(x);}
else if(y==tree[z].r&&x==tree[y].r) {zag(y); zag(x);}
else if(y==tree[z].l&&x==tree[y].r) {zag(x); zig(x);}
else if(y==tree[z].r&&x==tree[y].l) {zig(x); zag(x);}
update(x);
}
root=x;
}
void insert(int x,int k)
{
if(tree[x].key==k)
{
tree[x].cnt++;
update(x);
splay(x);
}
else if(tree[x].key<k)
{
if(tree[x].r==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].r=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
splay(tot);
return;
}
insert(tree[x].r,k);
update(x);
}
else if(tree[x].key>k)
{
if(tree[x].l==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].l=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
splay(tot);
return;
}
insert(tree[x].l,k);
update(x);
}
}
int search(int x,int k)
{
if(tree[x].key==k) return x;
if(tree[x].key<k) return search(tree[x].r,k);
if(tree[x].key>k) return search(tree[x].l,k);
}
void findnxt(int x,int k,int pd)
{
if(x==) return;
if(pd==)
{
if(tree[x].key<k)
{
ans=x;
findnxt(tree[x].r,k,pd);
} else findnxt(tree[x].l,k,pd);
}
else
{
if(tree[x].key>k)
{
ans=x;
findnxt(tree[x].l,k,pd);
} else findnxt(tree[x].r,k,pd);
}
} void erase(int x)
{
findnxt(root,x,);
int pos=search(root,x);
splay(pos);
if(tree[pos].cnt>)
{
tree[pos].cnt--;
update(pos);
splay(pos);
return;
}
if(ans==)
{
root=tree[pos].r;
tree[root].fa=;
return;
}
if(tree[x].r==)
{
root=tree[x].l;
tree[root].fa=;
return;
}
// printf("%d %d\n",pos,pro);
tree[tree[pos].r].fa=ans;
tree[tree[pos].l].fa=;
root=tree[pos].l;
tree[ans].r=tree[pos].r;
splay(ans);
ans=;
}
int findrank(int x)
{
int pos=search(root,x);
splay(pos);
return tree[tree[pos].l].size+;
}
int find(int x,int k)
{
int y=tree[x].l;
int z=tree[x].r;
if(k<=tree[z].size) return find(z,k);
// printf("%d %d\n",tree[x].cnt,tree[z].size);
k-=tree[z].size+tree[x].cnt;
if(k<=) return tree[x].key;
return find(y,k);
}
int main()
{
scanf("%d",&n);
while(n--)
{
int opt,x; scanf("%d%d",&opt,&x);
if(opt==)
{
insert(root,x);
}
if(opt==)
{
erase(x);
}
if(opt==)
{
printf("%d\n",findrank(x));
}
if(opt==)
{
printf("%d\n",find(root,x));
}
if(opt==)
{
findnxt(root,x,opt);
printf("%d\n",tree[ans].key);
ans=;
}
if(opt==)
{
findnxt(root,x,opt);
printf("%d\n",tree[ans].key);
ans=;
}
}
return ;
}

bzoj1503的更多相关文章

  1. 【bzoj1503】 NOI2004—郁闷的出纳员

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题目链接) 题意 要求维护4种操作:插入一个数,将所有数加上k,将所有数减去k,删去数值小于 ...

  2. [BZOJ1503][NOI2004]郁闷的出纳员

    [BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...

  3. Splay初步【bzoj1503】

    做了一道水题,把bzoj1503用Splay重新写了一下. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...

  4. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

  5. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

  6. bzoj1503郁闷的出(cheng)纳(xu)员

    好痛苦,,,WA了不知道多少遍 错的服了,,, 如果某员工的初始工资低于工资下界,他将立刻离开公司 我也不知道是我语文有问题还是题目有毒,反正这个东西好像不应该算在离开公司的总人数的答案里... 让我 ...

  7. 【BZOJ1503】[HAOI2007]反素数ant 搜索

    结论题...网上讲的好的很多... #include <iostream> using namespace std; ]={,,,,,,,,,},num=; long long ans,n ...

  8. BZOJ1503——郁闷的出纳员

    1.题目大意:一道treap题,支持插入,询问第K大,还有全体修改+上一个值,如果某个点值小于x,那么就删除这个点 插入100000次,询问100000次,修改100次..最后输出删了多少个点 2.分 ...

  9. 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

    splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...

随机推荐

  1. webform:分页组合查询

    一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql"& ...

  2. dp入门问题

    昨天晚上的rank彻底废了..一个星期没敲代码完全没手感.作为总结,贴一道昨天浪费了我两小时的dp.http://acm.dirring.com/problem.php?cid=1003&pi ...

  3. 改变图片的颜色,UIImage改变颜色

    定义 #import <UIKit/UIKit.h> @interface UIImage (ChangeImageColor) /** * 改变图片的颜色 * * @param tint ...

  4. 关于codeMirror插件使用的一个坑

    codeMirror插件可以做语法高亮渲染,但它操作过程是这样的:先从 textarea中读取值放到codemirror动态生成的div中,根据textarea中的换行个数确定行数,根据正则表达来高亮 ...

  5. BZOJ 2957 楼房重建

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  6. BZOJ 3669 【NOI2014】 魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  7. usb驱动开发16之设备生命线

    回到struct usb_hcd,继续努力的往下看. kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件. static void hcd_ ...

  8. Cordova - 使用Cordova开发iOS应用实战4(调用摄像头拍照,并编辑)

    使用Cordova可以很方便的通过js代码来使用设备摄像头拍照,只需把camera插件添加进来即可. 一,添加camera插件 首先我们要在“终端”中进入工程所在的目录,然后运行如下命令: 1 cor ...

  9. Linux socket多进程服务器框架一

    重点:socket共用方法中错误码的定义以及错误码的解析 底层辅助代码 //serhelp.h #ifndef _vxser #define _vxser #ifdef __cplusplus ext ...

  10. maven: 打包可运行的jar包(java application)及依赖项处理

    IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...