bzoj1861 书架


原题链接


神题。。。

先吐槽洛谷的样例

10 10
1 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 –1
Query 5
Query 2
Ask 2

bzoj的样例

10 10
1 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 -1
Query 5
Query 2
Ask 2

区别?号与-号。。。

于是洛谷样例被我改了!!!


吐槽完毕

如果你知道书在哪这就是treap裸题。

然而不知道

所以,要知道书在哪。

可以一开始记录一下每个点的地址。

地址永远不会改变对吧

然后?一直跳father,如果他是father的rs就ans+=father的ls的size+1

ans初值为ls的size+1

为什么是对的?自己想

然而treap并不能维护father,只好加一个

updata时顺便更新

il vd reset(){
size=ls->size+rs->size+1;
if(ls!=null)ls->fa=this;if(rs!=null)rs->fa=this;
}

然后?treap裸题a

1A了

// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define mp make_pair
#define pr pair<point,point>
#define fir first
#define sec second
typedef long long ll;
il int gi(){
rg int x=0;rg char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
const int maxn=80010;
int A[maxn],n;
int seed=233333;
il int Rand(){return seed=seed*23333ll%19260817;}
typedef struct node* point;
point null;
struct node{
int num,size,rand;
point ls,rs,fa;
node(int _num){num=_num,size=1,rand=Rand(),ls=rs=fa=null;}
il vd reset(){
size=ls->size+rs->size+1;
if(ls!=null)ls->fa=this;if(rs!=null)rs->fa=this;
}
};point root,pos[maxn];
il point build(int n){
point stk[n+1],now,lst;int top=0;
rep(i,1,n){
pos[A[i]]=now=new node(A[i]),lst=null;
while(top&&stk[top]->rand>now->rand)lst=stk[top],stk[top--]->reset();
if(top)stk[top]->rs=now;now->ls=lst,stk[++top]=now;
}
while(top)stk[top--]->reset();
return stk[1];
}
il point merge(point a,point b){
if(a==null)return b;
if(b==null)return a;
if(a->rand<b->rand){a->rs=merge(a->rs,b),a->reset();return a;}
b->ls=merge(a,b->ls),b->reset();return b;
}
il pr split(point x,int num){
if(x==null)return mp(null,null);
point ls=x->ls,rs=x->rs;
if(num==x->ls->size){x->ls=null,x->reset();return mp(ls,x);}
if(num==x->ls->size+1){x->rs=null,x->reset();return mp(x,rs);}
if(num<x->ls->size){pr t=split(x->ls,num);x->ls=t.sec;x->reset();return mp(t.fir,x);}
pr t=split(x->rs,num-x->ls->size-1);x->rs=t.fir;x->reset();return mp(x,t.sec);
}
il int getpos(point x){
int ret=x->ls->size+1;
while(x->fa!=null){
if(x==x->fa->rs)ret+=x->fa->ls->size+1;
x=x->fa;
}return ret;
}
int main(){
n=gi();
int m=gi();
null=new node(0);
null->size=0,null->ls=null->rs=null->fa=null;
rep(i,1,n)A[i]=gi();
root=build(n);
int S,T,p;
pr t1,t2,t3;point x;
char opt;
while(m--){
do opt=getchar();while(opt<'A'||opt>'Z');
if(opt=='T'){
S=gi(),p=getpos(pos[S]);
t1=split(root,p-1),t2=split(t1.sec,1);
root=merge(t2.fir,merge(t1.fir,t2.sec));
}
else if(opt=='B'){
S=gi(),p=getpos(pos[S]);
t1=split(root,p-1),t2=split(t1.sec,1);
root=merge(merge(t1.fir,t2.sec),t2.fir);
}
else if(opt=='I'){
S=gi(),scanf("%d",&T),p=getpos(pos[S]);
if(T==0)continue;
if(T==1)t1=split(root,p-1);else t1=split(root,p-2);
t2=split(t1.sec,1),t3=split(t2.sec,1);
root=merge(merge(merge(t1.fir,t3.fir),t2.fir),t3.sec);
}
else if(opt=='A')S=gi(),printf("%d\n",getpos(pos[S])-1);
else if(opt=='Q'){
p=gi();
t1=split(root,p-1);
x=t1.sec;while(x->ls!=null)x=x->ls;
printf("%d\n",x->num);
root=merge(t1.fir,t1.sec);
}
}
return 0;
}

bzoj1861 书架的更多相关文章

  1. bzoj1861 书架 splay版

    单点插入删除以及求前缀 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...

  2. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  3. [bzoj1861][Zjoi2006]Book 书架_非旋转Treap

    Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...

  4. BZOJ-1861 Book 书架 Splay

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Stat ...

  5. BZOJ1861:[ZJOI2006]书架

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  6. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

  7. BZOJ1861[ZJOI2006]Book书架

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  8. 【BZOJ1861】【splay】Book 书架

    Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿 ...

  9. [BZOJ1861][ZJOI2006]书架

    BZOJ Luogu Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看 ...

随机推荐

  1. 【[HEOI2016/TJOI2016]排序】

    巧妙思路题 有一个重要的思想就是把大于某一个数的数都变成\(1\),小于这个数的都变成\(0\),这个只有\(0\)和\(1\)的序列就很好处理了 由于我们只需要在最后求出一个位置上是什么数就可以了, ...

  2. 【[JXOI2017]加法】

    江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...

  3. 2、Dubbo-核心概念

    dubbo核心概念 2.1).简介 Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能.轻量级的开源Java RPC框架, 它提供了三大核心能力:面向接口的远程方法调用 ...

  4. [转]浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

  5. vim全选复制粘贴

    感谢来源:http://blog.sina.com.cn/s/blog_6e70abbd0100zbk9.html ggVG #gg: 光标跳转到首行,在vim才有效,vi中无效 #V 是进入Visu ...

  6. curl http code 0

    使用curl进行post请求后,接收status code ,结果返回的结果是0 ,但是请求返回的数据是正常的. 检查后发现是执行顺序问题: $response = [ 'statusCode' =& ...

  7. PAT——1050. 螺旋矩阵

    本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m- ...

  8. 指定Android adb的启动端口

    串口执行: setprop service.adb.tcp.port stop adbd start adbd 一般机器默认是5555为adb端口,但是今天遇到的一台机器以5037为默认端口,开发机器 ...

  9. UIImage指定区域自由拉伸

    UIImage的 resizableImageWithCapInsets 可以指定需要拉伸的位置,这个方法很有用,可以减少长短按钮数量

  10. iOS:手势与矩形、点运算相关(18-01-24更)

    1.矩形.点运算 1.获取当前的View在Window的frame 2.包含判断 3.获取点击在响应者 touchesBegan 的位置 4.UIScrollView.UITableView 实时 位 ...