BZOJ1861——book
就是给你一摞书,然后又询问第k大,编号为x的书是第几大,然后修改书的位置
splay模板题。。。然而我还是不会,,,又遇到lrj的书的坑了,rj的书里没有father,顿时弄得我ask不会搞了
注意合并和分离的时候考虑一下会不会出空树,如果是空树就会RE,特判一下
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
Node *ch[2];
Node *father;
int s;
int v;
inline int cmp(int x){
int ret = 0;
if(ch[0] != NULL) ret += ch[0] -> s;
if(x <= ret) return 0;
ret ++;
if(ret == x) return -1;
return 1;
}
inline void maintain(){
s = 1;
if(ch[0] != NULL) s += ch[0] -> s;
if(ch[1] != NULL) s += ch[1] -> s;
return;
}
};
struct Splay{
Node ft[100000];
int size;
Node *p;
int num[100000];
int a[100000];
inline void init(){
size = 0;
p -> ch[0] = p -> ch[1] = p -> father = NULL;
return;
}
inline void rotate(Node* &o, int d){
Node* k = o -> ch[d ^ 1]; o -> ch[d ^ 1] = k -> ch[d]; k -> ch[d] = o;
o -> maintain(); k -> maintain(); o = k;
o -> father = o -> ch[d] -> father;
if(o -> ch[d] -> ch[d ^ 1] != NULL) o -> ch[d] -> ch[d ^ 1] -> father = o -> ch[d];
o -> ch[d] -> father = o;
return;
}
inline void insert(Node* &o, int l, int r){
if(r < l) return;
int mid = (l + r) / 2;
o = &ft[size]; size ++;
o -> ch[0] = o -> ch[1] = o -> father = NULL;
o -> v = a[mid];
num[o -> v] = size - 1;
if(l != r){
insert(o -> ch[0], l, mid - 1);
if(o -> ch[0] != NULL) o -> ch[0] -> father = o;
insert(o -> ch[1], mid + 1, r);
if(o -> ch[1] != NULL) o -> ch[1] -> father = o;
}
o -> maintain();
return;
}
inline void splay(Node* &o, int k){
int d = o -> cmp(k);
if(d == 1 && o -> ch[0] != NULL) k = k - o -> ch[0] -> s - 1;
else if(d == 1) k --;
if(d != -1){
Node* w = o -> ch[d];
int d2 = w -> cmp(k);
int k2 = k;
if(d2 != 0 && w -> ch[0] != NULL) k2 = k2 - w -> ch[0] -> s - 1;
else if(d2 != 0) k2 --;
if(d2 != -1){
splay(w -> ch[d2], k2);
if(d == d2) rotate(o, d ^ 1);
else rotate(o -> ch[d], d);
}
rotate(o, d ^ 1);
}
return;
}
inline Node* merge(Node* left, Node* right){
if(left == NULL) return right;
if(right == NULL) return left;
splay(left, left -> s);
left -> ch[1] = right;
left -> ch[1] -> father = left;
left -> maintain();
return left;
}
inline void split(Node* o, int k, Node* &left, Node* &right){
if(k == 0){
left = NULL;
right = o;
return;
}
splay(o, k);
left = o;
right = o -> ch[1];
if(right != NULL) right -> father = NULL;
left -> ch[1] = NULL;
left -> maintain();
return;
}
inline int rank(Node* &o, int k){
int d = o -> cmp(k);
if(d == -1) return o -> v;
int st = 0;
if(o -> ch[0] != NULL) st = o -> ch[0] -> s;
if(d == 1) k = k - st - 1;
return rank(o -> ch[d], k);
}
inline int ask(int k){
int ret = 0;
Node* o = &ft[num[k]];
if(o -> ch[0] != NULL) ret = o -> ch[0] -> s;
while(o -> father != NULL){
if(o -> father -> ch[1] == o){
int u = 0;
if(o -> father -> ch[0] != NULL) u = o -> father -> ch[0] -> s;
ret += (u + 1);
}
o = o -> father;
}
return ret;
}
inline void Top(int k){
int t = ask(k) + 1;
Node *left, *mid, *right;
split(p, t, left, right);
split(left, t - 1, left, mid);
left = merge(mid, left);
left = merge(left, right);
p = left;
return;
}
inline void Bottom(int k){
int t = ask(k) + 1;
Node *left, *mid, *right;
split(p, t, left, right);
split(left, t - 1, left, mid);
left = merge(left, right);
left = merge(left, mid);
p = left;
return;
}
inline void Insert(int k, int w){
int t = ask(k) + 1;
Node *left, *mid, *right;
split(p, t, left, right);
split(left, t - 1, left, mid);
left = merge(left, right);
split(left, t + w - 1, left, right);
left = merge(left, mid);
left = merge(left, right);
p = left;
return;
}
} wt;
int main(){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &wt.a[i]);
wt.insert(wt.p, 1, n);
char str[20];
for(int i = 1; i <= m; i ++){
scanf("%s", str);
int k, w;
if(str[0] == 'Q'){
scanf("%d", &k);
printf("%d\n", wt.rank(wt.p, k));
}
else if(str[0] == 'A'){
scanf("%d", &k);
printf("%d\n", wt.ask(k));
}
else if(str[0] == 'T'){
scanf("%d", &k);
wt.Top(k);
}
else if(str[0] == 'B'){
scanf("%d", &k);
wt.Bottom(k);
}
else{
scanf("%d%d", &k, &w);
wt.Insert(k, w);
}
}
return 0;
}
BZOJ1861——book的更多相关文章
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- bzoj1861
bzoj1861[ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本 ...
- bzoj1861 书架
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 ...
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...
- BZOJ-1861 Book 书架 Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Stat ...
- BZOJ1861[ZJOI2006]Book书架
Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
- 【BZOJ1861】【splay】Book 书架
Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿 ...
- [BZOJ1861][ZJOI2006]书架
BZOJ Luogu Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看 ...
- BZOJ1861[Zjoi2006]书架——非旋转treap
题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...
随机推荐
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- JavaWeb---总结(十三)使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- CentOS只允许部分IP登陆ssh |ssh 允许指定IP
在/etc/hosts.allow输入 (其中192.168.10.88是你要允许登陆ssh的ip,或者是一个网段192.168.10.0/24) sshd:192.168.10.88:all ...
- Runner站立会议01
开会时间:9.10-9.30 地点:二教 今天做了什么:学了文本输入,button按钮,界面转换(意图) 遇到什么困难:界面转换时,出现问题,没有正常跳转 明天打所作什么:解决今天遇到的问题,学了第二 ...
- Java数据结构——队列
//================================================= // File Name : Queue_demo //-------------------- ...
- HTML 个人资料框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- asp+mysql__不同类型用户登录
未防注入//0.0 /***这里代码应用场景为多类用户登录,根据用户选择不同的单选按钮判断用户登录的类型,*从而进行不同的数据表进行判断,用户的用户名和密码是否正确.*/ public partial ...
- 取出return array() 数组内容
d.php文件 return array( "0" => 内容一, "1" => 内容二, "2" => 内容三, &qu ...
- lazyload.js实现图片异步载入
所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...
- Cpu Gpu 内存 显存 数据流
[精]从CPU架构和技术的演变看GPU未来发展 http://www.pcpop.com/doc/0/521/521832_all.shtml 显存与纹理内存详解 http://blog.csdn.n ...