度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣。  初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作。

①1 u w val 在编号为 u 的队列里加入一个权值为 val 的元素。(w=0 表示加在最前面,w=1 表示加在最后面)。

②2 u w 询问编号为 u 的队列里的某个元素并删除它。( w=0 表示询问并操作最前面的元素,w=1 表示最后面)

③3 u v w 把编号为 v 的队列“接在”编号为 u 的队列的最后面。w=0 表示顺序接(队列 v 的开头和队列 u 的结尾连在一起,队列v 的结尾作为新队列的结尾), w=1 表示逆序接(先将队列 v 翻转,再顺序接在队列 u 后面)。且该操作完成后,队列 v 被清空。

维护双向链表模拟, 删除的时候要注意判断删除后的结点在哪一侧.

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head const int N = 1e7+10;
int n, q, clk;
int head[N], tail[N];
struct _ {int l,r,v;} a[N];
int tim[N],ti;
void upd(int x) {
if (tim[x]!=ti) tim[x]=ti,head[x]=tail[x]=0;
}
void addL(int id, int v) {
upd(id);
a[++clk].v = v;
if (!head[id]) {
head[id] = tail[id] = clk;
a[clk].l = a[clk].r = -1;
}
else {
if (a[head[id]].l==-1) {
a[head[id]].l = clk;
a[clk].l = -1;
a[clk].r = head[id];
}
else {
a[head[id]].r = clk;
a[clk].r = -1;
a[clk].l = head[id];
}
head[id] = clk;
}
}
void addR(int id, int v) {
upd(id);
a[++clk].v = v;
if (!tail[id]) {
head[id] = tail[id] = clk;
a[clk].l = a[clk].r = -1;
}
else {
if (a[tail[id]].l==-1) {
a[tail[id]].l = clk;
a[clk].l = -1;
a[clk].r = tail[id];
}
else {
a[tail[id]].r = clk;
a[clk].r = -1;
a[clk].l = tail[id];
}
tail[id] = clk;
}
}
void delL(int id) {
upd(id);
if (!head[id]) return puts("-1"),void();
printf("%d\n", a[head[id]].v);
if (a[head[id]].l==-1&&a[head[id]].r==-1) {
head[id] = tail[id] = 0;
return;
}
int t = head[id];
if (a[t].l==-1) head[id] = a[t].r;
else head[id] = a[t].l;
if (a[head[id]].r==t) a[head[id]].r = -1;
else a[head[id]].l = -1;
}
void delR(int id) {
upd(id);
if (!tail[id]) return puts("-1"),void();
printf("%d\n", a[tail[id]].v);
if (a[tail[id]].l==-1&&a[tail[id]].r==-1) {
head[id] = tail[id] = 0;
return;
}
int t = tail[id];
if (a[t].l==-1) tail[id] = a[t].r;
else tail[id] = a[t].l;
if (a[tail[id]].l==t) a[tail[id]].l = -1;
else a[tail[id]].r = -1;
}
void reverse(int id) {
upd(id);
swap(head[id],tail[id]);
}
void merge(int x, int y) {
if (x==y) return;
upd(x),upd(y);
if (!head[y]) return;
if (!head[x]) {
head[x] = head[y];
tail[x] = tail[y];
}
else {
if (a[tail[x]].l==-1) a[tail[x]].l = head[y];
else a[tail[x]].r = head[y];
if (a[head[y]].l==-1) a[head[y]].l = tail[x];
else a[head[y]].r = tail[x];
tail[x] = tail[y];
}
head[y] = tail[y] = 0;
} void read(int &x){
scanf("%d",&x);
} int main() {
while (~scanf("%d%d", &n, &q)) {
++ti;
while (q--) {
int op,u,v,w;
read(op),read(u),read(v);
if (op==1) {
read(w);
if (v==0) addL(u,w);
else addR(u,w);
}
else if (op==2) {
if (v==0) delL(u);
else delR(u);
}
else {
read(w);
if (w) reverse(v);
merge(u,v);
}
}
}
}

hdu 6375 度度熊学队列 (链表模拟)的更多相关文章

  1. hdu6375 度度熊学队列

    度度熊学队列 题目传送门 解题思路 STL大法好.直接用deque,但是N的范围很大,如果直接开那么多的deque会爆内存,所以用map< int, deque< int>>, ...

  2. hdu 6375 百度之星 度度熊学队列

    题目链接 Problem Description 度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 ...

  3. 【2018百度之星初赛(A)】1002 度度熊学队列

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6375 Knowledge Point: STL - map:https://www.cnblogs.c ...

  4. 2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope

    c++ list使用 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstr ...

  5. 2018百度之星初赛(A)2 度度熊学队列

    思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...

  6. 2018百度之星初赛A轮 度度熊学队列

    注意:刚开始用数组存deque<int> qa[MAX]会爆内存 需要改用map<int, deque<int> > qa优化 不明觉厉 #include<b ...

  7. hdu 6118 度度熊的交易计划

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. [RK3399] 虚拟按键栏显示不全或者方向不对

    CPU:RK3399 系统:Android 7.1 同样的系统代码,换了一个小分辨率的屏,虚拟按键栏就出现显示不全,而且方向不对 出现这种问题的原因是显示密度和屏不匹配,需要适当的降低显示密度即可 d ...

  2. javascript的正则表达式总结

    网上正则表达式的教程够多了,但由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的.我们先从最简单地说起,文章所演示的正则基本都是perl方式. 元字符 ( [ { \ ^ $ ...

  3. 了解有关 in_memory 工作空间的详细信息

    ArcGIS 提供了一个可写入输出要素类和表的内存工作空间.作为将地理处理输出写入磁盘上的某个位置或网络位置的备选方案,可将输出写入内存工作空间中.通常,将数据写入内存工作空间要明显快于写入其他格式( ...

  4. daoliu平台:测试线路图

    1.进行需求收集及分析 搜索关键字:导流平台 同类产品体验及熟悉 搞清楚,业务流.数据流.用户焦点 2.初步熟悉原型 初步熟悉.遍历原型, 初步进行测试需求分析 3.聆听及和权威的人进行沟通 测试人员 ...

  5. 组合数学---P1358 扑克牌

    P1358 扑克牌 题解 组合数学 Π c[剩余未选牌数][ai] ( i = 1,2,...,m ) 注意 组合数也要取模,不然数字太大会炸 组合数的具体实现就是Dp啊 代码 #include< ...

  6. 关于浏览器请求PHP一次请求执行了两次

    测试同学今天又双叒反馈了一个Bug 继上次解决了重复请求的问题之后,本来就以为可以万事大吉了,没想到我还是太年轻了,测试同学说,不行啊,老哥,你这个我点击了一次创建居然创建出来两条数据!!并且查看日志 ...

  7. socket服务端开发之测试使用threading和gevent框架

    socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...

  8. ireport如何拼接sql?

    ireport如何拼接sql   ireport如何拼接sql? 解决方法: 1.ireport的sql select * from emp as e $P!{whereSQL}; 2.java代码 ...

  9. mysql无法导入函数和存储过程解决方法

    1. mysql> SET GLOBAL log_bin_trust_function_creators = 1; 2. 系统启动时 --log-bin-trust-function-creat ...

  10. python基础之线程、进程、协程

    线程 线程基础知识 一个应用程序,可以多进程.也可以多线程. 一个python脚本,默认是单进程,单线程的. I/O操作(音频.视频.显卡操作),不占用CPU,所以: 对于I/O密集型操作,不会占用C ...