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

解法:可以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. Vue基础理论

    一 vue的定位 (1)Vue.js是一个构建数据驱动的 web 界面的库. (2)Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. (3)Vue.js 自身不是一 ...

  2. ABAP Performance Examples

    *modifying a set of lines directly(批量修改内表数据) *使用"LOOP ... ASSIGNING ..."可以直接修改内表中的数据,而不需要先 ...

  3. SharePoint 2013 自定义模板页后在列表里修改不了视图

    前言 最近系统从2010升级至2013,有自定义模板页.突然发现在列表中切换不了视图,让我很费解. 我尝试过以下解决方案: 去掉自定义css 去掉自定义js 禁用所有自定义功能 结果都没有效还是一样的 ...

  4. all things are difficult before they are easy

    刚开始接触一项新知识时,总是感觉很难,只要你用心钻研下去,它会慢慢变简单的.

  5. 推荐几个优秀的java爬虫项目

    java爬虫项目   大型的: Nutch apache/nutch · GitHub 适合做搜索引擎,分布式爬虫是其中一个功能. Heritrix internetarchive/heritrix3 ...

  6. 【读书笔记】iOS-GCD-block-后台运行

    当一个app按home键退出的时候,只有最多5秒的时间做一些保存或清理资源的工作.但是调用beginBackgroundTaskWithExpirationHandler方法,可以最多有10分时间在后 ...

  7. iOS之UI--指示器HUD的创建和设置

    指示器的创建和设置 渐变动画 描述: 使用label就能制作指示器,原理:就是让label以动画的形式慢慢显示和消失 最好是半透明的 指示器有时候也被称为:HUD,遮盖,蒙版 思路步骤: 1.先在st ...

  8. centos 安装完Nginx后,为什么访问不了?

    很多时候,安装完成后,服务也启动了 但是访问不了 看看是不是防火墙开启了: 本地试下端口是否可访问telnet 192.168.4.155 80 CentOS 7默认使用的是firewall作为防火墙 ...

  9. jQuery 插件开发文章收集

    A jQuery plugin boilerplate http://jonathannicol.com/blog/2012/05/06/a-jquery-plugin-boilerplate/ jQ ...

  10. linux把EDT时间修改为CST格式

    初始时间:2012年 09月 14日 星期五 18:15:33 EDT [root@test ~]# mv /etc/localtime /etc/localtime.bak [root@test ~ ...