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 ...
随机推荐
- 资源很多,你却不会使用——以不变应万变才是自学Java的正确方法
鄙人乐于寻找学习方法,在这里提出自己的见解,希望可以帮助想玩好Java而又感觉很难上手的同学对Java不再恐惧 现状 我们的同学们除了某月,某婷等等大神以外,想必仍然存在着一大批同学根本没有摸索到学习 ...
- 20155318 2016-2017-2 《Java程序设计》第十周学习总结
20155318 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java ...
- 20155332 2016-2017-2 《Java程序设计》第10周学习总结
20155332 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技 ...
- BZOJ2039_employ人员雇佣_KEY
题目传送门 网络流,求最小割. 设tot为所有盈利的和,即所有人(不花钱)雇佣. 对于S->i建一条容量为c[i]的边,i->j建一条S[i][j]*2的边,之所以这样建是因为如果不选这个 ...
- 【LOJ10121】与众不同
[LOJ10121]与众不同 题面 LOJ 题解 这题是_\(tham\)给\(ztl\)他们做的,然而这道题™居然还想了蛮久... 首先可以尺取出一个位置\(i\)上一个合法的最远位置\(pre_i ...
- 解读python手册的例子a, b = b, a+b
Python手册上有个例子,用于输出10以内的斐波那契序列.代码如下: a, b = 0, 1 while b < 10: print(b) a, b = b, a+b 用到了一些Python的 ...
- 三、Django安装和流程
一.MVC模式 MVC(Model-View-Controller),中文名“模型-视图-控制器”,是一个好的Web应用开发所遵循的模式,它有利于把Web应用的代码分解为易于管理的功能模块. M:Mo ...
- halcon学习相关资料(转载)
https://blog.csdn.net/maweifei/article/details/78162581 论坛.培训 halcon学习网:http://www.ihalcon.com/ 鸟叔机器 ...
- 云主机启动提示Booting from Hard Disk GRUB
版本:Openstack ocata 系统:centos7.3 环境:VMware workstation12 解决方法: 或者
- Python mutilprocessing Processing 父子进程共享文件对象?
multiprocessing python多进程模块, 于是, Processing也是多进程的宠儿. 但今天讨论的问题, 似乎也能引起我们一番重视 直接上代码: 1 2 3 4 5 6 7 ...