hdu 6375 百度之星 度度熊学队列
初始时有 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 被清空。
对于每一组数据,第一行读入两个数 N 和 Q。
接下来有 Q 行,每行 3~4 个数,意义如上。
N≤150000,Q≤400000
1≤u,v≤N,0≤w≤1,1≤val≤100000
所有数据里 Q 的和不超过500000
注意,如果操作②的队列是空的,就输出−1且不执行删除操作。
1 1 1 23
1 1 0 233
2 1 1
1 2 1 2333
1 2 1 23333
3 1 2 1
2 2 0
2 1 1
2 1 0
2 1 1
-1
2333
233
23333
一个简单的例子:
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}
具体的来说,队列加点=连通图中新增一个节点并连一条边到指定的边界;队列删点=图删边;队列附加=两个连通图之间加一条边,连接两个边界点。
因为总是在队列首尾操作,也就是图的边界点,因此记录下每个连通图的两个边界,每次只需要找到图上边界点的相邻的点进行操作,并在操作完后,更新连通图的边界点。
代码
#include<stdio.h>
#include<memory.h>
int head[], tail[];
int n, q;
int id = ;
//双向链表节点
struct thing
{
int v;
int t1, t2;//不必记录顺序
thing() :v(), t1(-), t2(-) {}
void conn(int x) {
if (t1 == -)t1 = x;
else t2 = x;
}
void brk(int x) {
if (t1 == x)t1 = -;
else if (t2 == x)t2 = -;
}
}node[]; //头部插入
void qaddf(int qid, int nid) {
if (head[qid] == -) {
head[qid] = nid;
tail[qid] = nid;
}
else {
int h = head[qid];
node[nid].conn(h);
node[h].conn(nid);
head[qid] = nid;
}
} //尾部插入
void qadde(int qid, int nid) {
if (head[qid] == -) {
head[qid] = nid;
tail[qid] = nid;
}
else {
int t = tail[qid];
node[nid].conn(t);
node[t].conn(nid);
tail[qid] = nid;
}
} //头部删除
int delf(int qid) {
int s = head[qid];
if (s == -)return -; if (head[qid] == tail[qid]) {
head[qid] = -; tail[qid] = -;
return node[s].v;
} int next = (node[s].t1 != - ? node[s].t1 : node[s].t2);
node[next].brk(s);
head[qid] = next;
return node[s].v;
} //尾部删除
int dele(int qid) {
int s = tail[qid];
if (s == -)return -; if (head[qid] == tail[qid]) {
head[qid] = -; tail[qid] = -;
return node[s].v;
} int next = (node[s].t1 != - ? node[s].t1 : node[s].t2);
node[next].brk(s);
tail[qid] = next;
return node[s].v;
} //顺序连接
void linkf(int q1, int q2) {
if (head[q2] == -)return;
if (head[q1] != -) {
node[tail[q1]].conn(head[q2]);
node[head[q2]].conn(tail[q1]);
tail[q1] = tail[q2]; }
else
{
head[q1] = head[q2];
tail[q1] = tail[q2];
}
head[q2] = -; tail[q2] = -;
} //逆序连接
void linke(int q1, int q2) {
if(head[q2]==-)return;
if (head[q1] != -) {
node[tail[q1]].conn(tail[q2]);
node[tail[q2]].conn(tail[q1]);
tail[q1] = head[q2]; }
else
{
tail[q1] = head[q2];
head[q1] = tail[q2];
}
head[q2] = -; tail[q2] = -;
} //简易读外挂
void getn(int&x) {
x = ;
char ch;
do ch = getchar(); while (ch<'' || ch>'');
do { x = x * + ch - ''; ch = getchar(); } while ('' <= ch&&ch <= '');
} int main() {
int ipt[];
while (~scanf("%d %d", &n, &q)) {
id = ;
memset(head, -, sizeof head);
memset(tail, -, sizeof tail);
for (int i = ; i<q; ++i) {
getn(ipt[]);
switch (ipt[]) {
case ://在队列ipt[1]中插入ipt[3]到头/尾部(ipt[2]=0/1)
getn(ipt[]); getn(ipt[]); getn(ipt[]);
node[++id].v = ipt[]; node[id].t1 = -; node[id].t2 = -;
if (ipt[] == ) {
qaddf(ipt[], id);
}
else {
qadde(ipt[], id);
}
break;
case ://在队列ipt[1]中删除头/尾部(ipt[2]=0/1)
getn(ipt[]); getn(ipt[]);
if (ipt[] == ) {
printf("%d\n", delf(ipt[]));
}
else {
printf("%d\n", dele(ipt[]));
}
break;
case ://将队列ipt[2]正/反接到ipt[1]后面(ipt[3]=0/1)
getn(ipt[]); getn(ipt[]); getn(ipt[]);
if (ipt[] == )
linkf(ipt[], ipt[]);
else
linke(ipt[], ipt[]);
break;
default:
break;
}
}
}
}
#define tree \
\
*\
**\
***\
||
hdu 6375 百度之星 度度熊学队列的更多相关文章
- hdu6375 度度熊学队列
度度熊学队列 题目传送门 解题思路 STL大法好.直接用deque,但是N的范围很大,如果直接开那么多的deque会爆内存,所以用map< int, deque< int>>, ...
- hdu 6375 度度熊学队列 (链表模拟)
度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 u w val 在编号为 u 的队列里加入一个 ...
- 【2018百度之星初赛(A)】1002 度度熊学队列
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6375 Knowledge Point: STL - map:https://www.cnblogs.c ...
- 2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope
c++ list使用 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstr ...
- 2018百度之星初赛(A)2 度度熊学队列
思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...
- 2018百度之星初赛A轮 度度熊学队列
注意:刚开始用数组存deque<int> qa[MAX]会爆内存 需要改用map<int, deque<int> > qa优化 不明觉厉 #include<b ...
- 2017百度春招<度度熊买帽子的问题>
题目: 度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同.度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少? 数组中找到第三小的数字 注意边界条件 用STL中的set来 ...
- hdu 6119 …&&百度之星 T6
小小粉丝度度熊 Problem Description 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是 ...
- HDU - 6383 百度之星2018初赛B 1004 p1m2(二分答案)
p1m2 Accepts: 1003 Submissions: 4595 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072 ...
随机推荐
- 20155310 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155310 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验步骤 (一)敏捷开发与XP 1.敏捷开发 敏捷开发( ...
- easyui -validatebox 验证框加载
问题: easyui验证狂框有时会验证输入字符的位数,或者验证有效字符组合 解决: 使用easyui的验证框,继承验证框,指定输入框为验证框即可 $(function(){ $.extend($.fn ...
- Why HBase
3.1.1,为什么选用HBases a) 容量巨大 HBase 的单表可以有百亿行.百万列,数据矩阵横向和纵向两个维度所支持的数据量级 都非常具有弹性.传统的关系型数据库,如 Oracle ...
- 【LG4091】[HEOI2016/TJOI2016]求和
[LG4091][HEOI2016/TJOI2016]求和 题面 要你求: \[ \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j! \] 其中\(S\)表示第二类斯特林数,\ ...
- AngularJS中Directive指令系列
近段时间在研究Angular中的directive用法,打算写个系列.以官方文档为主.并参考诸多教程.加上自己的思考. 基本概念及用法 scope属性的使用. &, <, =, @ 符 ...
- a data verification error occurred, file load failed
1. 调试创龙DSP6748的时候,下载.out文件出现这个错误 2. 换了其他板子,还有其他仿真器也不行,最后发现是没加载GEL文件
- WPF DrawingContext Pen
<Window x:Class="WPFDrawing.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- LumiSoft.Net 收发邮件
一:LumiSoft.Net简介 Lumisoft is a software development company specialised in mobile phones and tablets ...
- Python登录,输入三次密码
第一段python代码,写了一天,总算不报错了,值得纪念. 基本要求: 写一个登录界面,登录三次锁定用户 1. 包含一个用户信息文件,用户名和密码 2.黑名单文件 过程: 1.先检查是否在黑名单中,如 ...
- 当git遇上中文乱码
git有个比较奇怪的问题,当目录或者文件名中出现了中文的时候,在执行git status 的时候,会返回一串unicode码,这段unicode码就读不懂了,必须解决. git status显示uni ...