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

本地测慢的一组要三四秒,一共要十几秒,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. OSG 安装配置

    对于普通用户推荐直接下载安装包配置.如有特殊需求或想了解编译过程可参考网上文章自己编译后配置.(通常建议使用第一种方法即可) 本人安装经验: 失败:自己系统64位,VS2010 32位,开始自己动手编 ...

  2. laravel5通过auth.attempt事件加入登陆验证码

    <?php namespace WangDong\Http\Controllers\Auth; use Illuminate\Http\Exception\HttpResponseExcepti ...

  3. ExtJS4 动态加载

    由于有人说不要每次都调用ext-all.js,会影响性能,所以有考虑动态加载,动态加载时页面调用ext.js(4.0.7在调试时可考虑用ext-dev.js),然后在onReady之前调用 Ext.L ...

  4. ubuntu 14.04.02 LTS 启动项误写入 /dev/sda1 (win 7 loader) 修复

    问题描述: 在win7下安装Ubuntu14.04,由于启动项 /boot loader 安装位置错误(/dev/sda1 (win 7 loader) )导致无法进入Windows(在GRUB界面能 ...

  5. C++ 类的前向声明

    前向声明 在计算机程序设计中, 前向声明是指声明标识符(表示编程的实体,如数据类型.变量.函数)时还没有给出完整的定义.即可以声明一个类而不定义它,只声明类但不知道类的成员变量.函数等具体细节. 如: ...

  6. img超出div width时, jQuery动态改变图片显示大小

    参考: 1. http://blog.csdn.net/roman_yu/article/details/6641911 2. http://www.cnblogs.com/zyzlywq/archi ...

  7. [r]Setting up Django and your web server with uWSGI and nginx

    Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...

  8. 今天写了个从一张表数据插入到另一张表的oracle 语句

    create or replace procedure data_move(param in number) is cursor enterprise is select SENTERPRISEID, ...

  9. 整理的Java资源

    这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式 ...

  10. 利用CSP探测网站登陆状态

    0x00 背景 今天看到zone里有同学发帖说了探测支付宝登录状态的帖子:http://zone.wooyun.org/content/17665 由此我想到了我们parsec的@/fd 半年前提到的 ...