【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架

需要用数组记录编号为i的书的位置,和位置i处的书的编号。

Code:

 1 #include<cstdio>
 2 #include<ext/pb_ds/assoc_container.hpp>
 3 #include<ext/pb_ds/tree_policy.hpp>
 4 using namespace std;
 5 using namespace __gnu_cxx;
 6 using namespace __gnu_pbds;
 7 tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> T;
 8 typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>::iterator ITER;
 9 //往bzoj上交时,请将null_type改成null_mapped_type
10 int Pos[100001],Val[500001],a,x,n,m;
11 char op[7];
12 int main()
13 {
14     scanf("%d%d",&n,&m);
15     for(int i=1;i<=n;i++)
16       {
17         scanf("%d",&Val[i+100000]);
18         Pos[Val[i+100000]]=i+100000;
19         T.insert(i+100000);
20       }
21     for(int i=1;i<=m;i++)
22       {
23         scanf("%s",op);
24         if(op[0]==‘T‘)
25           {
26             scanf("%d",&a);
27             int tmp=*T.find_by_order(0);
28             T.erase(T.lower_bound(Pos[a]));
29             Pos[a]=tmp-1;
30             Val[tmp-1]=a;
31             T.insert(tmp-1);
32           }
33         else if(op[0]==‘B‘)
34           {
35             scanf("%d",&a);
36             int tmp=*T.find_by_order(n-1);
37             T.erase(T.lower_bound(Pos[a]));
38             Pos[a]=tmp+1;
39             Val[tmp+1]=a;
40             T.insert(tmp+1);
41           }
42         else if(op[0]==‘I‘)
43           {
44             scanf("%d%d",&a,&x);
45             if(x==0)
46               continue;
47             ITER it=T.lower_bound(Pos[a]);
48             ITER it_Beside=it;
49             if(x==1)
50               it_Beside++;
51             else
52               it_Beside--;
53             swap(Val[*it],Val[*it_Beside]);
54             swap(Pos[Val[*it]],Pos[Val[*it_Beside]]);
55           }
56         else if(op[0]==‘A‘)
57           {
58             scanf("%d",&a);
59             printf("%d\n",T.order_of_key(Pos[a]));
60           }
61         else
62           {
63             scanf("%d",&a);
64             printf("%d\n",Val[*T.find_by_order(a-1)]);
65           }
66       }
67     return 0;
68 }
时间: 2024-08-10 17:01:15

【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架的相关文章

bzoj1861: [Zjoi2006]Book 书架(平衡树)

原题链接 题目描述:小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本书. 当然也有特殊情况,比如在看书的时候突然电话响了或

BZOJ1861 [Zjoi2006]Book 书架

从6点调到了现在22:19:07..脑子晕倒死. 用splay做,一开始怎么想也不知道该怎么play. 想了个办法,用pos[i]表示编号为i的书在树上的节点编号 s[i]表示树上的节点i代表的是哪本书. val[i]表示节点i的权值,这里的权值按照书从上到下的大小顺序来赋值,用来建树 TOP:先把树里面代表书S的那个节点删掉,然后再重新建一个节点把S放进去,这时候, 为了使新的节点在最前方,开一个mmin表示已经出现过的最小的数, 每次要把节点加入进去的时候插入几点的权值就是 --mmin:

【权值分块】bzoj1861 [Zjoi2006]Book 书架

权值分块……rank3……没什么好说的. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 int n,sz,sum,x,y,l[501],r[501],Min,Max,sumv[501],num[250001],m,v[250001],p[250001]; 6 bool b[250001]; 7 char op[6],c; 8 int Num,CH[1

bzoj1861 [Zjoi2006]Book 书架——splay

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... 但其实splay已经不是维护点权大小顺序的,它的最大作用就在于无论怎样旋转都保持着中序遍历这个相对位置不变: 所以很对应这道题,用splay进行各种操作的同时书的摆放顺序是不变的: 假设出一个'1'点.一个'n+1'点方便操作,所以整体+1: 这个建树的方法不错呢. 代码如下: #include<

BZOJ 1861: [Zjoi2006]Book 书架 (splay)

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1453  Solved: 822[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位

BZOJ 1861: [Zjoi2006]Book 书架 splay

1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本

[Zjoi2006]Book 书架

pre.cjk { font-family: "Droid Sans Fallback", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1581  Solved: 884[Submit][Status][Discuss] Description 小T有一

BZOJ 1861 [Zjoi2006]Book 书架 ——Splay

[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include

[题解]bzoj 1861 Book 书架 - Splay

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1396  Solved: 803[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位