1. 程式人生 > >1861: [Zjoi2006]Book 書架

1861: [Zjoi2006]Book 書架

Splay又寫挫了。。。。。。。。

回頭複習一下維修數列和LCT吧,不然Splay真不會寫了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=80000+5;
const int inf=1e9;
int id[N],ch[N][2],fa[N],a[N],root,sz[N],node,key[N],n,m;
inline void pushup(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;}
inline void rotate(int x,int &k){
	int y=fa[x],z=fa[y],l=ch[y][1]==x,r=l^1;
	if(y==k)k=x;
	else ch[z][ch[z][1]==y]=x;
	fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
	ch[y][l]=ch[x][r];ch[x][r]=y;
	pushup(y);pushup(x);
}
inline void splay(int x,int &k){
	while(x!=k){
		int y=fa[x],z=fa[y];
		if(y!=k){
			if(ch[y][0]==x^ch[z][0]==y)rotate(x,k);
			else rotate(y,k);
		}
		rotate(x,k);
	}
}
void build(int l,int r,int f){
	if(l>r)return;
	int mid=l+r>>1,now=mid,last=f;
	if(l==r){
		sz[now]=1;
	}else build(l,mid-1,mid),build(mid+1,r,mid);
	key[now]=a[mid];fa[now]=last;pushup(now);
	ch[last][mid>=f]=now;
}
int kth(int x,int k){
	int r=sz[ch[x][0]]+1;
	if(r==k)return x;
	else if(k<r)return kth(ch[x][0],k);
	else return kth(ch[x][1],k-r);
}
void del(int k){
	int x,y,z;
	x=kth(root,k-1);y=kth(root,k+1);
	splay(x,root);splay(y,ch[x][1]);
	z=ch[y][0];ch[y][0]=0;fa[z]=sz[z]=0;
	pushup(y);pushup(x);
}
void move(int k,int val){
	int x,y,z=id[k],rank;
	splay(z,root);rank=sz[ch[z][0]]+1;
	del(rank);
	if(val==inf)x=kth(root,n),y=kth(root,n+1);
	else if(val==-inf)x=kth(root,1),y=kth(root,2);
	else x=kth(root,rank+val-1),y=kth(root,rank+val);
	splay(x,root);splay(y,ch[x][1]);
	sz[z]=1;fa[z]=y;ch[y][0]=z;
	pushup(y);pushup(x);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=2;i<=n+1;i++){
		scanf("%d",&a[i]);id[a[i]]=i;
	}
	build(1,n+2,0);root=n+3>>1;
	char opt[10];int s,t;
	while(m--){
		scanf("%s%d",opt,&s);
		switch(opt[0]){
			case 'T':move(s,-inf);break;
			case 'B':move(s,inf);break;
			case 'I':scanf("%d",&t);move(s,t);break;
			case 'A':splay(id[s],root);printf("%d\n",sz[ch[id[s]][0]]-1);break;
			case 'Q':printf("%d\n",key[kth(root,s+1)]);break;
		}
	}
	return 0;
}


相關推薦

1861: [Zjoi2006]Book 書架

Splay又寫挫了。。。。。。。。 回頭複習一下維修數列和LCT吧,不然Splay真不會寫了。 #include<iostream> #include<cstdio> #include<cstring> using namespace s

bzoj 1861: [Zjoi2006]Book 書架

小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裡的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於這些書太有吸引力了,所以她看完後常常會忘記原來是放在書櫃的什麼位置。不過小T的記憶力是非常好的,所以每次放書的時候至少能夠

[Zjoi2006]Book書架

找到 www. inpu class pla sample ons return 放置 Description Sally有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。Sally在看書的時候,每次取出一本書,

bzoj1861: [Zjoi2006]Book 書架(平衡樹)

一個數 () == wap pre 吸引力 root 圖書管理 模板 原題鏈接 題目描述:小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於

bzoj1861: [Zjoi2006]Book 書架

Time Limit: 4 Sec Memory Limit: 64 MB Description 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裡的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本

1861. [ZJOI2006]書架【平衡樹-splay】

LG 困難 錯誤 哨兵 sin div 整數 能夠 let Description 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由

BZOJ 1861 Book 書架 第一份完全憑自己理解手敲的Splay樹啊。記念一下

// // 1861.cpp // ACM_BZOJ // // Created by ipqhjjybj on 13-9-9. // Copyright (c) 2013年 ipqhjjybj. All rights reserved. // 第一道完全手敲得啊。任重道遠。。 // #includ

「luogu2596 」[ZJOI2006]書架

turn ret tchar pda min inline return log bsp 用平衡樹維護每本書的位置 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=800

[ZJOI2006]書架

fine pos 離開 i++ its 基本操作 ret pri build 題目描述 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於

【題解】 [ZJOI2006]書架 (Splay)

source sin 操作 交換 size show 多少 href inf 懶得復制,戳我戳我 Solution: 還是一個\(Splay\),我們只用多存一個值\(rad\)來維護二叉樹,然後用數組存下每個書對應的值是多少 \(Top\)操作,我是把\(s\)旋轉到根

[Luogu 2596] ZJOI2006 書架

num else top cas eap main www bottom 省選 [Luogu 2596] ZJOI2006 書架 <題目鏈接> 第一次指針寫 FHQ_Treap(省選噩夢數據結構)AC 啦! 省選試機寫它,緊張過度失敗了。 省選 Day 1

洛谷 P2596 [ZJOI2006]書架 解題報告

ID 維護 get 個數 hang 交換 構造 play query P2596 [ZJOI2006]書架 題目描述 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完

[ZJOI2006] 書架

query 一行 看書 bits play 排名 實現 整數 情況 [ZJOI2006]書架 題目描述 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然

☆ [ZJOI2006] 書架 「平衡樹維護數列」

insert targe play amp bottom https efi 查詢 tdi 題目類型:平衡樹 傳送門:>Here< 題意:要求維護一個數列,支持:將某個元素置頂或置底,交換某元素與其前驅或後繼的位置,查詢編號為\(S\)的元素的排名,查詢排名第

BZOJ1861[Zjoi2006]書架——非旋轉treap

提示 i++ 裏的 hup sin 看書 可能 吸引力 pri 題目描述 小T有一個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裏的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。 小T在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於這些書太

ZJOI2006 書架

傳送門 這道題與普通的\(splay\)不大相同,別的都是以權值來排序,但這道題是以位置進行排序的,也就是對於一個節點,它的左子樹中的節點都在它的上面,右子樹中的節點都在他的下面。 這個比較獨特的一點在於建樹,這次不能再二分查詢要插入的位置了,而是每一次直接把當前插入的點作為上一次插入的點的右兒子(符合上

【BZOJ1861】書架ZJOI2006)-平衡樹復健題

測試地址:書架 做法:好久沒做平衡樹的題了,結果一道水題寫了一晚上……唉…… 這一道題需要用到平衡樹。 這一題可以按書的編號建點,然後給每個點附上一個優先值,那麼按優先值從小到大排序就是當前書架上書的順序了。題目中的幾個操作就可以寫成這樣: Top和Bo

[ZJOI2006]書架(樹狀陣列水過)

這道題顯然平衡樹,splay,treap什麼的隨便切 然而我不想打,決定水過這道題 把空間開3倍,樹狀陣列維護它前面的樹的個數,開個id陣列記錄位置 找一個數排名直接二分加求字首和,log^2的搞

bzoj1003 [ZJOI2006]物流運輸

mem ide opened ons spf ems line lap oid 傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 【題解】 瞎預處理瞎[i,j]天的最短路 dp處理即可。f[i]=min(f[j

POJ 1861:Network(最小生成樹&amp;&amp;kruskal)

nis bool cmp edge his table int pst 應該 Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13266 Accepted: 5