Data Handler

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=4286

Description

You are in charge of data in a company, so you are called "Data Handler". Different from the data in computer, the data you have are really in huge volume, and each data contains only one integer. All the data are placed in a line from left to right. There are two "hand" to handle the data, call hand "L" and hand "R". Every hand is between two adjacent data or at the end of the data line.
  In one day, the company gives you many commands to handle these data, so you should finish them one by one. At the beginning, there are N data, and hand "L" and "R" are in some positions. Each command is one the following formats:
  (1)MoveLeft L/R: it means that you should move the hand "L"/"R" left one data unit;

  (2)MoveRight L/R: it means that you should move the hand "L"/"R" right one data unit;

  (3)Insert L X: it means that you should insert the data that contains X at the right of the hand "L";

  (4)Insert R X: it means that you should insert the data that contains X at the left of the hand "R";

  (5)Delete L: it means that you should delete the one data at the right of the hand "L";

  (6)Delete R: it means that you should delete the one data at the left of the hand "R";

  (7)Reverse: it means that you should reverse all the data between hand "L" and hand "R".

  After finish all the commands, you should record all the data from left to right. So please do it.

Input

The first line contains an integer T(1<=T<=10), the number of test cases.
  Then T test cases follow. For each test case, the first line contains an integer N(1<=N<=500000), the number of data at the beginning. The second line contains N integers, means the integer in each data, from left to right. The third line contains two integers L and R (1<=L<=R<=N), the positions of hand "L" and hand "R". It means that hand "L" is at the left of the L-th data and hand "R" is at the right of the R-th data. The fourth line contains one integer M(1<=M<=500000), the number of commands. Then M lines follow, each line contains a command in the above format. All the integers in the data will in range [-10000,10000].
  It is guaranteed that there are always some data between hand "L" and "R", and if the hand is at the left/right end of the data line, it will not receive the command MoveLeft/MoveRight.
  Because of large input, please use scanf instead of cin.

Output

For each test case, output the integers in the data from left to right in one line, separated in a single space.
  Because of large output, please use printf instead of cout.

Sample Input

2
5
1 2 3 4 5
1 5
5
MoveLeft R
Insert R 6
Reverse
Delete R
Insert L 7
5
6536 5207 2609 6604 -4046
1 3
5
Delete L
Insert R -9221
Reverse
Delete L
MoveRight L

Sample Output

7 6 4 3 2 5
2609 5207 6604 -4046

HINT

题意

翻转,删除,插入操作

题解:

splay或者双端队列,但是我智商太低了,所以splay过不了

代码

#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int value;
int pre,next;
} num[];
int l,ll,r,rr,cnt;
void MoveLefe()
{
char ch[];
scanf("%s",ch);
if(ch[]=='L')
{
if(num[ll].pre==l)
{
l=ll;
ll=num[ll].next;
}
else
{
l=ll;
ll=num[ll].pre;
}
}
else
{
if(num[r].pre==rr)
{
rr=r;
r=num[r].next;
}
else
{
rr=r;
r=num[r].pre;
}
}
}
void MoveRight()
{
char ch[];
scanf("%s",ch);
if(ch[]=='L')
{
if(num[l].pre==ll)
{
ll=l;
l=num[l].next;
}
else
{
ll=l;
l=num[l].pre;
}
}
else
{
if(num[rr].pre==r)
{
r=rr;
rr=num[rr].next;
}
else
{
r=rr;
rr=num[rr].pre;
}
}
}
void Insert()
{
char ch[];
int value;
scanf("%s%d",ch,&value);
if(ch[]=='L')
{
num[cnt].pre=ll;
num[cnt].next=l;
if(num[ll].pre==l) num[ll].pre=cnt;
else num[ll].next=cnt;
if(num[l].pre==ll) num[l].pre=cnt;
else num[l].next=cnt;
l=cnt++;
num[l].value=value;
}
else
{
num[cnt].pre=rr;
num[cnt].next=r;
if(num[rr].pre==r) num[rr].pre=cnt;
else num[rr].next=cnt;
if(num[r].pre==rr) num[r].pre=cnt;
else num[r].next=cnt;
r=cnt++;
num[r].value=value;
}
}
void Delete()
{
char ch[];
int next;
scanf("%s",ch);
if(ch[]=='L')
{
if(num[l].pre==ll) next=num[l].next;
else next=num[l].pre;
if(num[ll].pre==l) num[ll].pre=next;
else num[ll].next=next;
if(num[next].pre==l) num[next].pre=ll;
else num[next].next=ll;
l=next;
}
else
{
if(num[r].pre==rr) next=num[r].next;
else next=num[r].pre;
if(num[rr].pre==r) num[rr].pre=next;
else num[rr].next=next;
if(num[next].pre==r) num[next].pre=rr;
else num[next].next=rr;
r=next;
}
}
void Reverse()
{
if(num[r].pre==rr) num[r].pre=ll;
else num[r].next=ll;
if(num[l].pre==ll) num[l].pre=rr;
else num[l].next=rr;
if(num[ll].pre==l) num[ll].pre=r;
else num[ll].next=r;
if(num[rr].pre==r) num[rr].pre=l;
else num[rr].next=l;
l=l^r;
r=l^r;
l=l^r;
}
void out(int n)
{
bool first=true;
int pre=;
for(int i=num[].next;i!=n+;)
{
if(first)
{
printf("%d",num[i].value);
first=false;
}
else printf(" %d",num[i].value);
if(num[i].next!=pre)
{
pre=i;
i=num[i].next;
}
else
{
pre=i;
i=num[i].pre;
}
}
printf("\n");
}
int main()
{
int cas,n,m;
char s[];
scanf("%d",&cas);
for(; cas--;)
{
scanf("%d",&n);
cnt=n+;
for(int i=; i<=n; ++i)
{
scanf("%d",&num[i].value);
num[i].pre=i-;
num[i].next=i+;
}
scanf("%d%d",&l,&r);
num[].pre=;
num[].next=;
num[n+].pre=n;
ll=num[l].pre;
rr=num[r].next;
scanf("%d",&m);
for(; m--;)
{
scanf("%s",s);
if(strcmp(s,"MoveLeft")==)
MoveLefe();
else if(strcmp(s,"MoveRight")==)
MoveRight();
else if(strcmp(s,"Insert")==)
Insert();
else if(strcmp(s,"Delete")==)
Delete();
else if(strcmp(s,"Reverse")==)
Reverse();
}
out(n);
}
return ;
}

HDU 4286 Data Handler 双向链表/Splay的更多相关文章

  1. HDU 4286 Data Handler --双端队列

    题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...

  2. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  3. HDU 4453:Looploop(Splay各种操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...

  4. HDU 4441 Queue Sequence(splay)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4441 题意:一个数列,三种操作:(1)插入:找到没在当前数列中的最小的正整数i,将其插在位置p之后,并 ...

  5. HDU 1890 Robotic Sort(splay)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1890 [题意] 给定一个序列,每次将i..P[i]反转,然后输出P[i],P[i]定义为当前数字i ...

  6. hdu 1754 I Hate It (splay tree伸展树)

    hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ...

  7. HDU 3487 Play with Chain | Splay

    Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDU 2217 Data Structure?

    C - Data Structure? Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  9. hdu 1890 Robotic SortI(splay区间旋转操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题解:splay又一高级的功能,区间旋转这个是用线段树这些实现不了的,这题可以学习splay的旋 ...

随机推荐

  1. Gridview点击Edit编辑未update和cancel后的问题

    在使用GridView时无意中发现一个问题: 第一步:点击列表中的某一行的"Edit"(例如第一行数据), 第二步:点击下一页,于是在下一页数据加载完成后就会看到对应的行(与第一步 ...

  2. JS 实现 ResizeBar,可拖动改变两个区域(带iframe)大小

    将网页化成两个区域,左边区域是一个树结构,右边区域是一个iframe,点击左边区域时,右边区域加载页面.实现功能:在两个区域间加一个可拖动条,拖动时改变左右两个区域的大小.在Google上搜索slid ...

  3. motan源码解读:注册中心zookeeper(2)

    上文大概讲解了利用zookeeper如何实现注册中心的.本文主要是从源码角度说明下.代码都在模块motan-registry-zookeeper中,其实在在这个模块中就3个类. ZkNodeType: ...

  4. 网易实习笔试真题C/C++

    刚做的时候根本就没有想到解题思路,刚好看到了别人的思路,自己写了一下.里面对unordered_map及vector二维数组的建立很灵活,另外区别了一下map,unordered_map,hash_m ...

  5. dedecms list 判断 每隔3次输出内容

    {dede:list pagesize='12' runphp='yes'} [field:global name=autoindex runphp="yes"](@me%3==0 ...

  6. 关于使用base36的技巧 生成 优惠券兑换码的相关讨论

    关于优惠券的生成后台的制作问题,已经拖了很久了还没有合并.但是持续暴露出来的问题 也很多,我的代码以及前面的一个人的代码被持续review暴露出了大量问题.昨天晚上在

  7. mysql-python模块编译问题解决

    解决方法:yum -y install mysql-devel libxml2 libxml2-dev libxslt* zlib gcc openssl [root@localhost MySQL- ...

  8. PartialView

    一.客户端直接请求分部视图(如使用AJAX) Return PartialView()  不加载布局页面,不执行_ViewStart.cshtml AJAX  /Home/LoginPart 二.视图 ...

  9. 转】MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3927677.html 感谢! 安装好MyEclipse之后,在MyEclipse中开发项目时,默认使用的是MyE ...

  10. 微软IOC容器Unity简单代码示例2-配置文件方式

    @(编程) 1. 通过Nuget下载Unity 这个就不介绍了 2. 接口代码 namespace UnityDemo { interface ILogIn { void Login(); } } n ...