题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列。

解法:可以splay做,但是其实双端队列更简便。

维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L,R]这段区间的值和[L,R]右边的值。然后维护一个revd标记表示[L,R]内的数是否被翻转了,翻转了的话改变一下一些操作就行了。自己写一个pop_Front()和pop_Back()函数,分别取队首和队尾元素,然后队首或队尾pop掉。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define N 500007 deque<int> LE,MI,RI;
deque<int>::iterator it;
int fir,revd,a[N]; int pop_Back(deque<int>& d)
{
int now = d.back();
d.pop_back();
return now;
} int pop_Front(deque<int>& d)
{
int now = d.front();
d.pop_front();
return now;
} void out()
{
if(fir){ printf("%d",*it); fir = ; }
else printf(" %d",*it);
} void print()
{
fir = ;
for(it=LE.begin();it!=LE.end();it++)
out();
if(revd)
{
for(it=MI.end()-;it!=MI.begin()-;it--)
out();
}
else
{
for(it=MI.begin();it!=MI.end();it++)
out();
}
for(it=RI.begin();it!=RI.end();it++)
out();
puts("");
} int main()
{
int t,n,x,i,l,r,m;
char ss1[],ss2[];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d%d%d",&l,&r,&m);
LE.clear(), MI.clear(), RI.clear();
for(i=;i<l;i++) LE.push_back(a[i]);
for(i=l;i<=r;i++) MI.push_back(a[i]);
for(i=r+;i<=n;i++) RI.push_back(a[i]);
revd = ;
while(m--)
{
scanf("%s",ss1);
if(ss1[] == 'R')
revd ^= ;
else if(ss1[] == 'M')
{
scanf("%s",ss2);
if(ss1[] == 'L') //MoveLeft
{
if(ss2[] == 'L') //point L MoveLeft
{
x = pop_Back(LE);
if(revd) MI.push_back(x);
else MI.push_front(x);
}
else //point R MoveLeft
{
if(revd) x = pop_Front(MI);
else x = pop_Back(MI);
RI.push_front(x);
}
}
else //MoveRight
{
if(ss2[] == 'L') //point L MoveRight
{ if(revd) x = pop_Back(MI);
else x = pop_Front(MI);
LE.push_back(x);
}
else //point R MoveRight
{
x = pop_Front(RI);
if(revd) MI.push_front(x);
else MI.push_back(x);
}
}
}
else if(ss1[] == 'I')
{
scanf("%s%d",ss2,&x);
if(ss2[] == 'L')
{
if(revd) MI.push_back(x);
else MI.push_front(x);
}
else
{
if(!revd) MI.push_back(x);
else MI.push_front(x);
}
}
else if(ss1[] == 'D')
{
scanf("%s",ss2);
if(ss2[] == 'L')
{
if(revd) pop_Back(MI);
else pop_Front(MI);
}
else
{
if(!revd) pop_Back(MI);
else pop_Front(MI);
}
}
}
print();
}
return ;
}

HDU 4286 Data Handler --双端队列的更多相关文章

  1. HDU 4286 Data Handler 双向链表/Splay

    Data Handler Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  2. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  3. HDU 6375(双端队列 ~)

    题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...

  4. HDU - 6386 Age of Moyu (双端队列+bfs)

    题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...

  5. [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

  6. python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...

  7. PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)

    1074 Reversing Linked List (25 分)   Given a constant K and a singly linked list L, you are supposed ...

  8. Leetcode641.Design Circular Deque设计循环双端队列

    设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头部. 如果操作成功返回 tr ...

  9. 用python实现栈/队列/双端队列/链表

    栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)应用:将十进制数转换成任意进制数 class Stack: # 用列表创 ...

随机推荐

  1. 那些教程没有的php1-基础知识补漏

    php.net 字符串 heredoc结构 类似双引号,其中的变量会被解析.严格遵循下边的格式,结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符. <?php $str = < ...

  2. 验证坐标在某片坐标区域内 php 代码

    之前碰到的这样一个需求,要将公司的服务范围在地图中显示出来,并将用户每天的访问坐标进行统计看有多少用户是在所能达到的服务范围半径内. 以下是PHP代码的实现 (仅验证坐标在某片坐标区域内) <? ...

  3. php学习笔记:利用gd库生成图片,并实现随机验证码

    说明:一些基本的代码我都进行了注释,这里实现的验证码位数.需要用的字符串都可以再设置.有我的注释,大家应该很容易能看得懂. 基本思路: 1.用mt_rand()随机生成数字确定需要获取的字符串,对字符 ...

  4. Genymotion Shell命令

    命令行选项 •-h 输出帮助信息 •-r ip_address 连接到特定Genymotion虚拟设备 •-c "command" 在原生shell环境中执行给定命令而后返回 •- ...

  5. 求Mac 的adt插件!

    搞了半天原来ADT Mac和win是通用的安装方法也相同! 自己配环境! 下载一个Eclipse,然后安装就行! dns:203.195.223.190 这个DNS可以连上谷歌的服务器(只限学习使用) ...

  6. 【使用 DOM】使用 Document 对象

    Document 对象时通往DOM功能的入口,它向你提供了当前文档的信息,以及一组可供探索.导航.搜索或操作结构与内容的功能. 我们通过全局变量document访问Document对象,它是浏览器为我 ...

  7. c# Json Dictionary序列化和反序列化

    说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能.感觉完全可以把这样的类封装到C#库中,很具 ...

  8. IOS 网络浅析-(五 xml解析)

    XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...

  9. 关于UI资源获取资源的好的网站

    前言:和我一样喜欢UI的一定喜欢这里的内容. 下面是关于sketch资源获取网页,点击图片就能进入: 连接是:https://github.com/JakeLin 居然意外百度到Sketch中国,还提 ...

  10. Mac平台下启动MySQL到完全终止MySQL----终端八步走

    1.选中Finder的情况下,快捷键进入搜索目录:/usr/local 然后进入mysql目录下: 2.右键 "从这里启动" 打开终端: 3.输入执行:./scripts/mysq ...