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: # 用列表创 ...
随机推荐
- ASP.NET Web API获取Model元数据
using System; using System.Web.Http; using Common; namespace ConsoleApp { internal class Program { p ...
- .net经验积累
希望对.net编程者有所帮助 1.学会配置环境变量 1.我的电脑-属性-环境变量-双击下面的path-粘贴路径 2.ctrl+r 输入软件名字按回车 2.常用vs2010快捷键 代码格式化:ct ...
- AutoCAD .NET二次开发(四)
在CAD中,属性信息一般是以注记的形式存在,但当属性数据内容较多时,显示就成了问题.扩展属性(Xdata)可以解决这一问题,比如南方Cass中就利用了这一点.我们经常用Lisp来读取操作扩展属性. 查 ...
- Sharepoint 2013 关于"SPChange"简介
在SharePoint中,我们经常会需要获取那些改变的项目,其实api为我们提供了SPChange对象,下面,我们通过列表简单介绍下这一对象. 1.创建一个测试列表,名字叫做“SPChangeItem ...
- [android] SQLite 数据库的升级 和 降级
public class SqliteHelp extends SQLiteOpenHelper { /* * context:创建数据库所需的 上下文对象 * name: 数据库名字 * facto ...
- KVC实现原理简介
KVC,全称:Key-Value-Coding. KVC运用了isa-swizzling技术.isa-swizzling就是类型混合指针机制.KVC主要通过isa-swizzling来实现其内部定位查 ...
- IOS 网络浅析-(七 JSON解析之三方JSONKit)
在这个网络横行的时代......... 有没有小说的感觉,哈哈
- C语言中Static和Const关键字的的作用
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块 ...
- iOS之UI--微博个人详情页
前言:微博个人详情页,和我常用的的QQ空间的详情页是同样的.要求能够融会贯通,做这一类的界面能够快速上手实现. 动态图效果展示: 直接使用UINavigationBar->UITableView ...
- UVa 106 - Fermat vs Pythagoras(数论题目)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...