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: # 用列表创 ...
随机推荐
- web技术人员-推荐书籍
学习是技术人员成长的基础,本次分享20本技术方面的书籍,这些书不是每一本都是经典,但是每一本都有其特点.以下20本大部分本人都看过,因此推荐给大家.(本次推荐的20本只是一个参考,比如像Head Fi ...
- 你还记的那一年你我学习的-->>用表组织数据*(数据表)
不知不觉,踏上IT之路,光阴似箭,日月如梭.虽好像回到从前,回到那个无忧无虑的童年,回到那个花样少年的青春;回到那个年少幼稚的小学;回到那个整天幻想的初中;回到那个顽强不屈,誓死不弃的高中;回到那个整 ...
- ajax提交复杂对象数据
public class RouteItemManageReq { private List<WorkNodeReq> targetNodes; private RouteItemReq ...
- springmvc+mybatis+spring 整合 bootstrap
获取[下载地址] [免费支持更新]三大数据库 mysql oracle sqlsever 更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] ...
- 【GOF23设计模式】策略模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_策略模式.CRM中报价策略.GUI编程中布局管理器底层架构 package com.test.strategy; /** ...
- webpack常用的插件安装命令
webpack常用的插件安装命令:1:npm install html-webpack-plugin --save-dev //自动快速的帮我们生成HTML.2:npm install css-loa ...
- js中获取css属性
直接获取 window.onload = function() { var but = document.getElementById('button'); var div = document.ge ...
- ArcGIS使用Python脚本工具
在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...
- 解决连接Oracle 11g报ORA-01034和ORA-27101的错误
参考文献: http://10000001.blog.51cto.com/4600383/1248367 背景: 使用sqlplus连接oracle,提示ORA-01034和ORA-27101,具体内 ...
- Objective-C之优雅的命名
There are only two hard things in Computer Science: cache invalidation and naming things.在计算机科学中只有两件 ...