hdu 4286
splay 练手用;
杭电的oj要手动开栈;
#include<cstdio>
#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstring>
#include<algorithm>
#define inf 999999
#define maxn 1500009
#define lch(rt) son[rt][0]
#define rch(rt) son[rt][1]
using namespace std; int son[maxn][],fa[maxn];
int val[maxn],size[maxn],flg[maxn];
int cnt,root;
int num[maxn];
int n,m; void push_up(int rt)
{
size[rt]=size[lch(rt)]+size[rch(rt)]+;
} void push_down(int rt)
{
if(flg[rt])
{
swap(lch(rt),rch(rt));
if(lch(rt))
flg[lch(rt)]^=;
if(rch(rt))
flg[rch(rt)]^=;
flg[rt]=;
}
} void newnode(int &rt,int f,int v)
{
rt=++cnt;
lch(rt)=rch(rt)=;
val[rt]=v;
fa[rt]=f;
size[rt]=;
flg[rt]=;
} void build(int l,int r,int &rt,int f)
{
if(l>r)return;
int mid=(l+r)>>;
newnode(rt,f,num[mid]);
build(l,mid-,lch(rt),rt);
build(mid+,r,rch(rt),rt);
push_up(rt);
} void ini()
{
cnt=root=;
lch()=rch()=;
fa[]=val[]=flg[]=size[]=;
newnode(root,,);
newnode(rch(root),root,inf);
build(,n,lch(rch(root)),rch(root));
push_up(rch(root));
push_up(root);
} void rotate(int x,int kind)//0->left,1->right
{
push_down(x);
int y=fa[x];
son[y][kind^]=son[x][kind];
fa[son[x][kind]]=y;
if(fa[y])
son[fa[y]][son[fa[y]][]==y]=x;
fa[x]=fa[y];
son[x][kind]=y;
fa[y]=x;
push_up(y);
} void splay(int rt,int goal)//将rt节点旋转到goal的右子节点
{
if(rt!=goal)
{
push_down(rt);
while(fa[rt]!=goal)
{
if(lch(fa[rt])==rt)
rotate(rt,);
else rotate(rt,);
}
push_up(rt);
if(!goal)root=rt;
}
} int select(int k)
{
int rt=root;
push_down(rt);
while(size[lch(rt)]+!=k)
{
if(size[lch(rt)]+>=k)
rt=lch(rt);
else
{
k-=(size[lch(rt)]+);
rt=rch(rt);
}
push_down(rt);//不加就超时;
}
return rt;
} int cntt;
void dfs(int rt)
{
push_down(rt);
if(lch(rt))
dfs(lch(rt));
num[cntt++]=val[rt];
if(rch(rt))
dfs(rch(rt));
} void flip(int a,int b)
{
a=select(a-);
splay(a,);
b=select(b+);
splay(b,a);
flg[lch(b)]^=;
} char s[],t[]; int main()
{
int tt;
int ld,rd;
scanf("%d",&tt);
while(tt--)
{
scanf("%d",&n);
for(int i=; i<=n; i++)
scanf("%d",&num[i]);
ini();
scanf("%d%d",&ld,&rd);
ld++;
rd++;
int cot=;
int a,b;
scanf("%d",&m);
int dat;
while(m--)
{
scanf("%s",s);
if(s[]=='M')
{
scanf("%s",t);
if(t[]=='R'&&s[]=='R')
rd++;
else if(t[]=='R'&&s[]=='L')
rd--;
else if(t[]=='L'&&s[]=='R')
ld++;
else ld--;
}
else if(s[]=='I')
{
cot++;
scanf("%s%d",t,&dat);
if(t[]=='L')
{
a=select(ld-);
b=select(ld);
}
else
{
a=select(rd);
b=select(rd+);
}
rd++;
splay(a,);
splay(b,a);
newnode(lch(b),b,dat);
fa[lch(b)]=b;
push_up(b);
push_up(a);
}
else if(s[]=='R')
{
flip(ld,rd);
}
else if(s[]=='D')
{
cot--;
scanf("%s",t);
if(t[]=='L')
{
a=select(ld-);
b=select(ld+);
}
else
{
a=select(rd-);
b=select(rd+);
}
rd--;
splay(a,);
splay(b,a);
push_down(a);
push_down(b);
lch(b)=;
push_up(b);
push_up(a);
}
}
a=select();
b=select(n+cot+);
splay(a,);
splay(b,a);
n+=cot;
cntt=;
dfs(root);
for(int i=;i<n;i++)
printf("%d ",num[i]);
printf("%d\n",num[n]);
}
return ;
}
hdu 4286的更多相关文章
- HDU 4286 Data Handler 双向链表/Splay
Data Handler Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- hdu 4286 (list的reverse时间复杂度为n)
list 的翻转reverse源码: // 将链表倒置 // 其算法核心是历遍链表, 每次取出一个结点, 并插入到链表起始点 // 历遍完成后链表满足倒置 template <class T, ...
- [GodLove]Wine93 Tarining Round #8
比赛链接: http://vjudge.net/contest/view.action?cid=47644#overview 比赛来源: 2012 ACM/ICPC Asia Regional Tia ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
随机推荐
- 如何解决linux(ubuntu/CENTOS)中gedit中文乱码的问题
http://jingyan.baidu.com/article/1709ad80a443c54634c4f09c.html 同时按键盘的Alt 和 F2,就可以打开“运行程序”对话框,这个功能类似于 ...
- [问题] PHP接收Request payload传递过来的参数
在使用Apidoc的时候,有一个配置参数是 @apiSampleRequest http://localhost/api 在测试时,发现发送的参数是Request payload的,而PHP中使用的A ...
- iOS开发--Swift RAC响应式编程
时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...
- PHP之会话控制小结
会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...
- 比较ASP生成静态HTML文件的几种方法
将动态页面转换生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录(特别是对接受动态参数的页面).前台访问时,脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度. 当然,凡事 ...
- android N刷机
1. 打开开发者选项2. 在开发者选项页面打开 oem解锁3. 运行 adb reboot bootloader4. 运行 fastboot flashing unlock5. 解压你下载的刷机包 6 ...
- anyConnect连接VPN后无法上网
最近想使用学校图书馆的VPN, 使用的是anyConnect的客户端.每次连接后都显示连接成功,但是马上就无法上网了. 开始以为是win10系统不兼容的问题,在虚拟机里面用win7测试可以成功,但是因 ...
- HW--漂亮度
描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和.每个字母都有一个“漂亮度”,范围在1到26之间.没有任何两个字母拥有相同的“漂亮度”.字母忽略大小 ...
- HTML <input> 标签的 type 属性
HTML <input> 标签的 type 属性 HTML <input> 标签 实例 下面的表单拥有两个输入字段以及一个提交按钮: <form action=" ...
- FFMPEG高级编程第一篇:环境搭建及编译
前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了.今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家 ...