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(最小生成樹&&kruskal)
nis bool cmp edge his table int pst 應該 Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13266 Accepted: 5