HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列。
解法:可以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 --双端队列的更多相关文章
- HDU 4286 Data Handler 双向链表/Splay
Data Handler Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 6375(双端队列 ~)
题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...
- HDU - 6386 Age of Moyu (双端队列+bfs)
题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...
- [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque
Design your implementation of the circular double-ended queue (deque). Your implementation should su ...
- python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...
- 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 ...
- Leetcode641.Design Circular Deque设计循环双端队列
设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头部. 如果操作成功返回 tr ...
- 用python实现栈/队列/双端队列/链表
栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)应用:将十进制数转换成任意进制数 class Stack: # 用列表创 ...
随机推荐
- linux下log4j乱码解决
使用log4j的时候,在WIN系统的时候正常显示中文,但是发布到linux系统的时候中文就显示成乱码了 由于log4j配置文件中没有设置编码格式(encoding),所以log4j就使用系统默认编码. ...
- 六个创建模式之抽象工厂模式(Abstract Factory Pattern)
问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q100-Q103)
Question 100You create a Web Part.You need to display the number of visits to a SharePoint site coll ...
- 内置对象Clob对从数据库表中取的字符大对象CLOB类型的列值进行读取操作
package readclobDemo.bao; import java.io.IOException; import java.io.Reader; import java.sql.Clob; i ...
- 深入理解Android的startservice和bindservice
一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...
- iOS开源JSON解析库MJExtension
iOS中JSON与NSObject互转有两种方式:1.iOS自带类NSJSONSerialization 2.第三方开源库SBJSON.JSONKit.MJExtension.项目中一直用MJExte ...
- 《慕客网:IOS动画案例之会跳动的登入界面(下)》学习笔记 -Sketch的使用
导出选中的一个图片,比如这里我们选中background,然后点击软件的右下角,可以设置导出的尺寸: 然后添加1倍,2倍,3倍的尺寸,因为在ihpne6之后就需要这三个尺寸倍数的UI,以适应不同设备的 ...
- C++中的多态与虚函数的内部实现
1.什么是多态 多态性可以简单概括为“一个接口,多种行为”. 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可 ...
- 测试管理_出色测试管理者的思考[持续更新ing]
如何合理安排并按质按量按时完成每一个测试任务,做好项目管理? 如何把控到每一个测试任务的质量? 如何快速构建和构建好测试环境? 如何获取或快速制作测试数据? 如何确保每一个测试人员的工作都饱满? 如何 ...
- 每日Scrum--No.7
Yesterday:学习和设计路线的编程 Today:编写代码 Problem:.在设计查询参观路线的时候,整个逻辑特别的混乱,设想了各种树,图以及网的遍历问题,但经过多次与同学的交流以及网上的查询资 ...