描述

现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车

该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少

现在请你维护这条隧道的车辆进出记录,并支持查询最高车辆的功能

输入

第一行仅含一个整数,即高度查询和车辆出入操作的总次数n

以下n行,依次这n次操作。各行的格式为以下几种之一:

1. E x		//有一辆高度为x的车进入隧道(x为整数)
2. D //有一辆车离开隧道
3. M //查询此时隧道中车辆的最大高度

输出

若D和M操作共计m次,则输出m行 对于每次D操作,输出离开隧道车辆的高度 对于每次M操作,输出所查询到的最大高度

输入样例

9
E 5
E 6
M
E 2
M
D
M
D
M

输出样例

6
6
5
6
6
2

限制

0 ≤ n ≤ 2,000,000

0 ≤ x ≤ 231 - 1

保证车辆的进出序列是合法的

提示

如何由多个栈来模拟一个队列?可参考第四章末尾的某习题。

如何实现一个能够高效获取最大值的栈?

如何实现一个可以高效获取最大值的队列?

可参考第04章XA节的讲义以及《习题解析》的[10-19]题、[10-20]题


【solution】

本题的关键在于如何以较小的时间复杂度维护一个可以查询当前区间最大值的队列。

需要用到双端队列,或者说 队堆(queap)。

不妨先考虑对于栈如何来维护一个 getMax() 接口:

通过以上分析,不难写出如下AC代码(S和P均用链表来维护):

 #include <stdio.h>
#include <stdlib.h> typedef struct Node
{
int data;
struct Node *next, *pre;
}node, *pnode; typedef struct Count
{
int data, num;
struct Count *next, *pre;
}count, *pcount; int main(void)
{
pnode shead = (pnode)malloc(sizeof(node));
pnode tmp1, stail = shead; pcount phead = (pcount)malloc(sizeof(count));
pcount tmp2, ptail = phead; int n; scanf("%d", &n); for (int i = ; i < n; ++i)
{
char ch;
int x, a; do
{
ch = getchar();
} while ((ch != 'E') && (ch != 'M') && (ch != 'D')); switch (ch)
{
case 'E':
scanf("%d", &x); // x into s
tmp1 = (pnode)malloc(sizeof(node));
tmp1->data = x;
stail->next = tmp1; tmp1->pre = stail; stail = tmp1; // prepare num for x into p
a = ;
tmp2 = (pcount)malloc(sizeof(count));
ptail->next = tmp2; tmp2->pre = ptail; ptail = tmp2;
while ((ptail->pre != phead) && (ptail->pre->data <= x))
{
a += ptail->pre->num; tmp2 = ptail->pre;
tmp2->pre->next = ptail;
ptail->pre = tmp2->pre;
delete tmp2;
} // x into p
ptail->data = x; ptail->num = a; break;
case 'D':
printf("%d\n", shead->next->data);
shead = shead->next;
delete shead->pre; if (!(--(phead->next)->num))
{
phead = phead->next;
delete phead->pre;
}
break;
case 'M':
printf("%d\n", phead->next->data);
break;
}
} return ;
}

* 图片解析 来自于 xuetangx 数据结构课程 丁俊晖 老师 的《习题解析》


【Tsinghua OJ】隧道(Tunel)问题的更多相关文章

  1. 【Tsinghua OJ】灯塔(LightHouse)问题

    描述 海上有许多灯塔,为过路船只照明.从平面上看,海域范围是[1, 10^8] × [1, 10^8] . (图一) 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北.西南两个对顶的直角区域.探照灯的 ...

  2. 【Tsinghua OJ】祖玛(Zuma)问题

    描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...

  3. 【Tsinghua OJ】范围查询(Range)问题

    [问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...

  4. 【Tsinghua OJ】多米诺骨牌(domino)问题

    (domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...

  5. 【Tsinghua OJ】循环移位(Cycle)

    Description Cycle shifting refers to following operation on the sting. Moving first letter to the en ...

  6. Tsinghua OJ Zuma

    Description Let's play the game Zuma! There are a sequence of beads on a track at the right beginnin ...

  7. ACM/ICPC 之 快排+归并排序-记录顺序对(TSH OJ-LightHouse(灯塔))

    TsingHua OJ 上不能使用<algorithm>头文件,因此需要手写快排(刚开始写的时候自己就出了很多问题....),另外本题需要在给横坐标排序后,需要记录纵坐标的顺序对的数量,因 ...

  8. ACM/ICPC 之 双向链表_构造列表-模拟祖玛 (TSH OJ-Zuma(祖玛))

    这一题是TsingHua OJ上的一道题目,学堂在线的一位数据结构老师的题目(原创),所以我直接把题目先贴下来了,这道题对复习双向链表很有帮助,而且也对数据结构中List,也就是对列表的回顾也是很有帮 ...

  9. Android终端配置isatap隧道使用IPV6的方法

    使用isatap隧道可以在手机有IPV4网络的情况下访问IPv6网络资源.关于isatap隧道的配置方法,清华.上交两所学校都给出了相应的在windows xp/2003,windows 2000,以 ...

随机推荐

  1. HDU----(3294)Girls' research(manacher)

    Girls' research Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  2. asp.net 奇淫技巧

    VS2013自动注释插件 分享一个Visual Studio的背景插件,让堆码更富情趣 工欲善其事必先利其器系列之:更换Visual Studio代码风格. 为Visual Studio更换皮肤和背景 ...

  3. node 事件循环

    什么是事件循环 Node只运行在一个单一线程上,至少从Node.js开发者的角度是这样的.在底层, Node是通过libuv来实现多线程的. Libuv库负责Node API的执行.它将不同的任务分配 ...

  4. kafka consumer属性

    consumer属性 group.id:指定consumer group的唯一标识. consumer.id:唯一标识consumer.默认值为null,不指定时会自动生成. zookeeper.co ...

  5. [转]RAID技术介绍和总结

    以下内容转自伯乐在线:http://blog.jobbole.com/83808/ 原文出处: 涯余(@若东临于沧海) ---------------------------------------- ...

  6. 如何获得bin/Debug目录的路径?

    这个可以使用下面的方法 答案:bin目录:通过应用程序集合AppDomain.CurrentDomain.BaseDirectory:带有"\"System.Environment ...

  7. 查看Nginx、apache、MySQL和PHP的编译参数

    1.nginx编译参数:#/usr/local/nginx/sbin/nginx -V2.apache编译参数:# cat /usr/local/apache/build/config.nice3.p ...

  8. JNI的一些知识:

    JNI字段描述符"([Ljava/lang/String;)V" 2012-05-31 12:16:09| 分类: Android |举报|字号 订阅 "([Ljava/ ...

  9. if语句使用

    package yuan; public class Yuan { public static void main(String[] args) { int a = 1; int b = 8; int ...

  10. bzoj 2561: 最小生成树

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...