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 ...
随机推荐
- IDEA 运行报错 failed to create a child event loop
背景 在IDEA中写了测试代码,但是运行的时候一直提示 java.lang.IllegalStateException: failed to create a child event loop ... ...
- 【LOJ6433】【PKUSC2018】最大前缀和
[LOJ6433][PKUSC2018]最大前缀和 题面 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做这个题,于是小 C ...
- Spark优化一则 - 减少Shuffle
Spark优化一则 - 减少Shuffle 看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要***)详细讲解了Spa ...
- 车牌,车架号,VIN码毫秒识别技术,汽车后市场的春天到来了
vin码(车架号)识别运用 不仅在制造.销售.保养.保险.车辆评估.交易环节会需要录入汽车的VIN码,在交通事故处理中,作为汽车身份唯一识别码,VIN码是处理事故的执法人员必须要记录的信息之一.随着汽 ...
- hdfs向hbase上传数据报错分析
通过hbse的import工具向hbase导入文件时出现出错误: hbase org.apache.hadoop.hbase.mapreduce.Driver import hbase_rgrid_k ...
- python-创建进程的三种方式
目录 1,os.fork() 方法 2,Process方法 3,Pool方法 1,os.fork() 方法 import os ret = os.fork() if ret == 0: #子进程 pr ...
- JDBC及DBUtils
1.JDBC2.DBUtils ###01JDBC概念和数据库驱动程序 * A: JDBC概念和数据库驱动程序 * a: JDBC概述 * JDBC(Java Data Base Connectivi ...
- Alpha 冲刺(6/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...
- Alpha 冲刺7
队名:日不落战队 安琪(队长) 今天完成的任务 完善回收站. 学习okhttp. 明天的计划 继续研究okhttp. 尝试登录的数据对接. 还剩下的任务 个人信息对接. 遇到的困难 今天白天焊接,晚上 ...
- Java 线程安全问题
线程安全问题产生原因: 1.多个线程操作共享的数据: 2.操作共享数据的线程代码有多条. 当一个线程正在执行操作共享数据的多条代码过程中,其它线程也参与了运算, 就会导致线程安全问题的发生. cl ...