[LSGDOJ1822]书架 Splay
题目描述
输入
输出
样例输入
样例输出
提示
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<cstdlib>
- #include<ctime>
- using namespace std;
- const int N=,INF=;
- struct node
- {
- int x,size,book;
- node *child[],*fa;
- }a[N*];
- node *pos=a,*root,*id[N];
- void newnode(node *&r,int key,node *ff,int number)
- {
- r=pos++;
- r->size=,id[number]=r;
- r->x=key;r->fa=ff;r->book=number;
- r->child[]=r->child[]=NULL;
- }
- int gi()
- {
- int str=;char ch=getchar();
- while(ch>'' || ch<'')ch=getchar();
- while(ch>=''&& ch<='')str=str*+ch-'',ch=getchar();
- return str;
- }
- int n,m;
- void updata(node *&r)
- {
- if(r){
- r->size=(r->child[]?r->child[]->size:)+(r->child[]?r->child[]->size:)+;
- return ;
- }
- }
- void rotate(node *&r,bool t)
- {
- node *y=r->fa;
- y->child[!t]=r->child[t];
- if(r->child[t])r->child[t]->fa=y;
- r->fa=y->fa;
- if(y->fa)y->fa->child[y->fa->child[]==y]=r;
- r->child[t]=y;
- y->fa=r;
- updata(y);
- updata(r);
- updata(r->fa);
- }
- void splay(node *r,node *g)
- {
- while(r->fa!=g)
- {
- if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
- else{
- node *y=r->fa;
- bool t=y->fa->child[]==y;
- if(y->child[t]==r)rotate(r,!t);
- else rotate(y,t);
- rotate(r,t);
- }
- }
- if(g==NULL)root=r;
- }
- void insert(node *&r,int key,node *fa,int number)
- {
- if(r==NULL){
- newnode(r,key,fa,number);
- splay(r,NULL);
- return;
- }
- else insert(r->child[key>r->x],key,r,number);
- }
- node *pre,*nxt;
- char s[];
- void getpre(node *r,int key)
- {
- if(!r)return ;
- if(r->x>=key)getpre(r->child[],key);
- else pre=r,getpre(r->child[],key);
- }
- void getnext(node *r,int key)
- {
- if(!r)return ;
- if(r->x<=key)getnext(r->child[],key);
- else nxt=r,getnext(r->child[],key);
- }
- void Ask(int x)
- {
- splay(id[x],NULL);
- printf("%d\n",root->child[]?root->child[]->size:);
- return ;
- }
- int getrank(node *r,int rk)
- {
- while(r){
- int d=r->child[]?r->child[]->size:;
- if(rk==d+)return r->book;
- if(rk<d+)r=r->child[];
- else rk-=d+,r=r->child[];
- }
- return -;
- }
- node *findmax(node *r)
- {
- if(r->child[])return findmax(r->child[]);
- else return r;
- }
- int maxn=,minn=;
- void Delet(int x)
- {
- node *y;
- splay(id[x],NULL);
- if(root->child[]){
- y=findmax(root->child[]);
- splay(y,root);
- y->child[]=root->child[];
- y->fa=NULL;
- if(root->child[])
- root->child[]->fa=y;
- root=y;
- updata(y);
- }
- else{
- root=root->child[];
- root->fa=NULL;
- }
- }
- void Totop(int x,bool t)
- {
- Delet(x);
- if(!t)
- insert(root,--minn,NULL,x);
- else
- insert(root,++maxn,NULL,x);
- }
- void change(int x,int y)
- {
- node *kl;
- if(y==)getnext(root,id[x]->x),kl=nxt;
- else getpre(root,id[x]->x),kl=pre;
- y=kl->book;
- swap(id[x],id[y]);
- swap(id[x]->book,id[y]->book);
- }
- int main()
- {
- int x,y;
- n=gi();m=gi();maxn=n;
- for(int i=;i<=n;i++){
- x=gi();
- insert(root,i,NULL,x);
- }
- int cc=;
- while(m--){
- scanf("%s%d",s,&x);
- if(s[]=='A')Ask(x);
- else if(s[]=='Q')printf("%d\n",getrank(root,x));
- else if(s[]=='I'){scanf("%d",&y);if(y)change(x,y);}
- else if(s[]=='T')Totop(x,);
- else if(s[]=='B')Totop(x,);
- }
- return ;
- }
[LSGDOJ1822]书架 Splay的更多相关文章
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- BZOJ-1861 Book 书架 Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Stat ...
- [题解]bzoj 1861 Book 书架 - Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1396 Solved: 803[Submit][Stat ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- 洛谷.2596.[ZJOI2006]书架(Splay)
题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...
- BZOJ1861:[ZJOI2006]书架(Splay)
Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
- 洛谷 P2596 [ZJOI2006]书架 (splay)
题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...
- bzoj1861 书架 splay版
单点插入删除以及求前缀 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...
- BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题
#include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...
随机推荐
- 关于python词典(Dictionary)的get()用法
先贴出参考链接:http://www.runoob.com/python/att-dictionary-get.html get()方法语法: dict.get(key, default=None) ...
- 项目Beta冲刺Day1
项目进展 李明皇 今天解决的进度 点击首页list相应条目将信息传到详情页 明天安排 优化信息详情页布局 林翔 今天解决的进度 前后端连接成功 明天安排 开始微信前端+数据库写入 孙敏铭 今天解决的进 ...
- RxSwift(一)
文/iOS_Deve(简书作者) 原文链接:http://www.jianshu.com/p/429b5160611f 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者" ...
- ssh框架-Struts2(二)
上篇文章我们了解了怎么配置struts.xml文件,以及前端控制器配置怎么配置,,Action进阶,Result结果配置,Struts2中的Servlet的API的访问,以及怎么获得请求参数.今天我们 ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
- 服务器批量管理软件ansible安装以及配置
1.yum安装(管理主机以及被管理主机都需要安装) yum install epel-release yum install ansible 2.配置管理主机 vim /etc/ansible/hos ...
- python——常用模块
python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...
- flask开发表单
from flask import Flask from flask import render_template from flask import request from flask impor ...
- PhantomJS命令行选项
支持命令行选项有: --help或-h列出所有可能的命令行选项.立即停止,不会运行一个脚本作为参数传递. --version或-v打印的版本PhantomJS.立即停止,不会运行一个脚本作为参数传递. ...
- JS面向对象使用面向对象进行开发
面向对象基础一之初体验使用面向对象进行开发 对 JS 中的面向对象的基础进行讲述, 初体验使用面向对象进行开发 主要内容是 面向对象的概念及特性 用面向对象的方式解决简单的标签创建实例 一些基础的 ...