终于用自己的方法水过去了。

本地测慢的一组要三四秒,一共要十几秒,BZOJ貌似一共只让跑6s,于是就还T着的。

一开始没看n<=1e8,想的直接splay+map(splay维护名次,map维护对应标号的节点所在位置)

然后写完看到n的范围 就傻了= =

百度了一下 splay里面的点要包含一段区间

想了半天 自己yy了一个做法:

一开始就一个点:[1,n+2](虚拟节点什么的蛋疼死了,一会+1,一会-1)

于是需要[l,r]中的p点时,就拆成[l,p-1][p,p][p+1,r],可是这样会不会影响树的形状?

分析一下,表示区间的点是不会有儿子的,所以我们可以很自然的把这样的点当成普通点看待。

然后又有一个问题,如何找到这个点在哪个区间里?

一开始想的建两个splay,另一个splay就是用来干这个的,觉得太麻烦就一直没写。

最后YY出用set来维护,用set<node(l,r,id)>来维护每个区间,每产生一个区间,就把他扔到set里,然后按r排序

不难发现,对于x,>=x的第一个r所在的区间一定包含它。然后找到split即可……

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
using namespace std; const int Maxn=+;
inline int getint(){
int x=,f=;
char c=getchar();
for(;!isdigit(c)&&c!='-';c=getchar());
if(c=='-')f=;
for(;isdigit(c);c=getchar())x=x*+c-'';
return f?x:-x;
}
inline void getint(int&x){x=getint();}
struct node{
int l,r,id;
inline bool operator<(const node&rhs)const{return r<rhs.r;}
node(int l,int r,int id):l(l),r(r),id(id){}
};
int n,m,a;
map<int,int>pos;
set<node> Set;
typedef set<node>::iterator it;
typedef int pnode;
struct Splay{
int lp[Maxn],rp[Maxn],p[Maxn],l[Maxn],r[Maxn],sz[Maxn],v[Maxn],cnt,tot,root;
inline void update(int x){
if(lp[x]==rp[x])sz[x]=sz[l[x]]+sz[r[x]]+;
else sz[x]=rp[x]-lp[x]+;
}
inline void split(int x,int mid){// x is a node in Splay Tree and mid is a pointer but not a value
Set.erase(node(lp[x],rp[x],x));
int L=,R=;
if(lp[x]!=mid){
L=++tot;
l[x]=L;
p[L]=x;
lp[L]=lp[x];
rp[L]=mid-;
if(lp[L]==rp[L]){
v[L]=lp[x]-;
if(v[L]==n+)v[L]=;
if(v[L])pos[v[L]]=L;
}
else Set.insert(node(lp[L],rp[L],L));
}
if(rp[x]!=mid){
R=++tot;
r[x]=R;
p[R]=x;
lp[R]=mid+;
rp[R]=rp[x];
if(lp[R]==rp[R]){
v[R]=rp[x]-;
if(v[R]==n+)v[R]=;
if(v[R])pos[v[R]]=R;
}
else Set.insert(node(lp[R],rp[R],R));
}
v[x]=mid-;
if(v[x]==n+)v[x]=;
if(v[x])pos[v[x]]=x;
rp[x]=lp[x]=mid;
if(L)update(L);
if(R)update(R);
update(x);
}
inline int find(int x){// x is stand for val
int t=pos[x];
if(t)return t;
it p=Set.lower_bound(node(,x+,));
t=p->id;
split(t,x+);
return t;
}
inline void zig(int x){
int y=p[x],z=p[y],w=r[x];
l[y]=w;r[x]=y;
if(l[z]==y)l[z]=x;
if(r[z]==y)r[z]=x;
p[x]=z;p[y]=x;if(w)p[w]=y;
update(y);update(x);
}
inline void zag(int x){
int y=p[x],z=p[y],w=l[x];
r[y]=w;l[x]=y;
if(l[z]==y)l[z]=x;
if(r[z]==y)r[z]=x;
p[x]=z;p[y]=x;if(w)p[w]=y;
update(y);update(x);
}
inline void rotate(int x){
if(l[p[x]]==x)zig(x);else zag(x);
}
inline void splay(int x,int FA){
for(;p[x]!=FA;){
int y=p[x],z=p[y];
if(z!=FA){
if( (l[y]==x)^(l[z]==y) )rotate(x);else rotate(y);
}
rotate(x);
}
if(!FA)root=x;
}
inline void init(){
cnt=tot=sz[]=;
root=++tot=;
lp[root]=,rp[root]=n+;
Set.insert(node(,n+,root));
update(root);
}
int kth(int o,int k){
if(rp[o]!=lp[o]){
split(o,lp[o]+k-);
return o;
}
int s=sz[l[o]];
if(s+==k)return o;
if(s+<k)return kth(r[o],k-s-);
return kth(l[o],k);
}
inline int deal(){
if(m==)
m=;
int x,y,opt;
getint(opt);
if(opt==){
getint(x),getint(y);
x-=a,y-=a;
int o=find(x);
v[o]=y;
pos[x]=;
pos[y]=o;
splay(o,);
return a=sz[l[o]];
}
else if(opt==||opt==){
getint(x);x-=a;
x=find(x);
splay(x,);
int rk=sz[l[x]];
if(rk==n&&opt==)return a=rk;
if(rk==&&opt==)return a=rk;
int lt=kth(root,rk- +),rt=kth(root,rk+ +);//for the static 1
splay(lt,);
splay(rt,lt);
l[rt]=;
update(rt);
update(lt);
int fst,snd;
if(opt==)fst=kth(root,),snd=kth(root,);
else fst=kth(root,n),snd=kth(root,n+);//for 1 has been killed
splay(fst,);
splay(snd,fst);
l[snd]=x;
p[x]=snd;
update(snd);
update(fst);
return a=rk;
}
else {
getint(x);x-=a;
return a=v[kth(root,x+)];
}
}
}sp;
int main(){
freopen("onlinejudge.in","r",stdin);
freopen("onlinejudge.out","w",stdout);
scanf("%d%d",&n,&m);
sp.init();
for(;m--;)printf("%d\n",sp.deal());
return ;
}

SCOI2014 方伯伯的OJ onlinejudge的更多相关文章

  1. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  2. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  3. 方伯伯的OJ ( onlinejudge )

    方伯伯的OJ 题目描述 方伯伯正在做他的OJ.现在他在处理OJ 上的用户排名问题. OJ 上注册了n 个用户,编号为1 ∼ n,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用 ...

  4. luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树

    LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...

  5. [SCOI2014]方伯伯的OJ(线段树)

    方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...

  6. [SCOI2014]方伯伯的OJ

    看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...

  7. 洛谷 P3285 / loj 2212 [SCOI2014] 方伯伯的 OJ 题解【平衡树】【线段树】

    平衡树分裂钛好玩辣! 题目描述 方伯伯正在做他的 OJ.现在他在处理 OJ 上的用户排名问题. OJ 上注册了 \(n\) 个用户,编号为 \(1\sim n\),一开始他们按照编号排名.方伯伯会按照 ...

  8. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

  9. 【bzoj 3595】: [Scoi2014]方伯伯的Oj

    传送门&& 原题解 蒟蒻终于做到一道方伯伯的题了…… 调了一个上午一直TLE(发现自己打了好久的splay板子竟然是错的这种丢人事情我就不说了) 很明显,要建两棵树,$T1$维护排名, ...

随机推荐

  1. NSCondition的用法,NSCondication实现线程同步,生产者消费问题实现(转载)

    NSCondition的用法 使用NSCondition,实现多线程的同步,即,可实现生产者消费者问题. 基本思路是,首先要创建公用的NSCondition实例.然后: 消费者取得锁,取产品,如果没有 ...

  2. 关于C#与.NET Framework

    前几天,有一个做测试的问我.NET Framework是什么,和C#是什么关系呢. 下面我就来解释一下.NET Framework是什么:.NET Framework是一个框架,是应用程序运行时所需要 ...

  3. Delphi动态创建组件,并释放内存

    开发所用delphi版本是xe2,效果图如下: 代码如下: ---------------------------------------------------------------------- ...

  4. JS & JQuery 动态添加 select option

    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...

  5. hdoj 1087 (DP)

    代码: #include<iostream>   #include<cmath>   using namespace std;  int a[1005], dp[1005];  ...

  6. 改进《完美让IE兼容input placeholder属性的jquery实现》的不完美

    <完美让IE兼容input placeholder属性的jquery实现>中的代码在IE9以下浏览器中会出错,原因是因为ie9以下的浏览器对input的标签的解释不同. 例如对以下文本框的 ...

  7. window对象细节(转载)

    Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY.FRAMESET或FRAME元素时,都会自动建立window对象的实例.另 ...

  8. ecshop 嵌入地图加载不了问题

    在ecshop 添加一个标识商家地理位置信息. 百度地图,加载不出来,查了下发现跟 js/transport.js 与 js/utils.js 两个文件有关在需要插入地图的地方去掉这两个文件的引用 地 ...

  9. 常用jQuery选择器总结【转】

    在Dom 编程中我们只能使用有限的函数根据id 或者TagName 获取Dom 对象. 然而在jQuery 中则完全不同,jQuery 提供了异常强大的选择器用来帮助我们获取页面上的对象, 并且将对象 ...

  10. ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)

    网上提供了很多Asp.net中操作Excel的方法,其中大部分是调用微软的Office组件,下面提供三个无须安装Office即可从Asp.net输出Excel的方法. 1 简单方法 //下面代码输出的 ...