【HDU4967】Handling the Past
题意
模拟栈操作。有三种操作push,pop,peak分别代表从栈顶压入元素,删除栈顶元素,查询栈顶元素。但是,每个操作会给出一个时间戳,要求操作必须要按照时间戳来进行。但是对于每个peak必须马上给出查询结果。其中n<=50000,xi,ti<=1e9
分析
讲真,这种题必须结合样例才能明白让干嘛。如果暴力的话,对于每个peak的时间复杂度都是O(n)。所以我们想到了线段树。
1.因为t的值很大,所以我们要首先将t离散化(我因为离散化写丑了一开始还T了好几发)
2.将每个push的t和x对应的记录下来
3.对于每个操作push,我们在t的位置插入1,对于每个pop操作,我们在t的位置插入-1。对于每个peak操作,我们找到t左边的第一个t1,符合sum(t1 to t)>0,这时候和t1对应的x值就是答案。
思路是很好想的,然后就是操作3该怎么通过线段树来维护?
我们通过线段树来维护一个区间和,和一个最大后缀和,然后对于没个peak查询,所有从1到t的线段树的结点,从右往左找,如果加上当前结点的最大后缀和大于0的话,这个答案就一定在这个节点内,否则加上这个结点的区间和继续往左找。这里可以结合代码进行理解。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map> using namespace std;
const int maxn=+;
struct Ope{
string name;
int t,a;
}ope[maxn];
int n,kase;
int V[maxn],M[maxn];
int sumv[*maxn],max_suff[*maxn];
int v,x;
void maintain(int o){
sumv[o]=sumv[*o]+sumv[*o+];
max_suff[o]=max(max_suff[*o+],sumv[*o+]+max_suff[*o]);
}
void update(int o,int L,int R){
if(L==R){
sumv[o]+=x;
max_suff[o]+=x;
return ;
}
int M=L+(R-L)/;
if(v<=M)update(*o,L,M);
if(v>M)update(*o+,M+,R);
maintain(o);
return;
}
int tot,ans;
int ql,qr;
void solve(int o,int L,int R){
if(L==R){
ans=L;
return;
}
int M=L+(R-L)/;
if(tot+max_suff[*o+]>)
return solve(*o+,M+,R);
tot+=sumv[*o+];
return solve(*o,L,M);
}
void query(int o,int L,int R){
if(ans!=-)
return;
if(ql<=L&&qr>=R){
if(tot+max_suff[o]>){
solve(o,L,R);
}
else tot+=sumv[o];
return;
}
int M=L+(R-L)/;
if(M<qr)
query(*o+,M+,R);
if(M>=ql)
query(*o,L,M);
return;
}
int main(){
kase=;
while(scanf("%d",&n)!=EOF&&n){
printf("Case #%d:\n",++kase);
for(int i=;i<=n;i++){
cin>>ope[i].name;
if(ope[i].name=="push"){
scanf("%d%d",&ope[i].a,&ope[i].t);
}
if(ope[i].name=="pop"||ope[i].name=="peak"){
scanf("%d",&ope[i].t);
}
V[i]=ope[i].t;
}
sort(V+,V++n);
for(int i=;i<=n;i++){
if(ope[i].name=="push"){
int tt=lower_bound(V+,V++n,ope[i].t)-V;
M[tt]=ope[i].a;
}
}
/* for(int i=1;i<=n;i++){
int tt=lower_bound(V+1,V+1+n,ope[i].t)-V;
cout<<tt<<endl;
}*/ memset(sumv,,sizeof(sumv));
memset(max_suff,,sizeof(max_suff)); for(int i=;i<=n;i++){
if(ope[i].name=="push"){
v=lower_bound(V+,V++n,ope[i].t)-V;
x=;
update(,,n);
}
else if(ope[i].name=="pop"){
v=lower_bound(V+,V++n,ope[i].t)-V;
x=-;
update(,,n);
}
else{
ql=,qr=lower_bound(V+,V++n,ope[i].t)-V;
tot=,ans=-;
query(,,n);
printf("%d\n",ans==-?-:M[ans]);
}
}
}
return ;
}
【HDU4967】Handling the Past的更多相关文章
- 【二】jekyll 的使用
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- 【四】注入框架RoboGuice使用:(Your First System Service Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...
- 【方法】如何限定IP访问Oracle数据库
[方法]如何限定IP访问Oracle数据库 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知 ...
- 【DevExpresss】3、LookUpEdit详解(转载)
[DevExpresss]3.LookUpEdit详解 哈,今天又用到了LookUpEdit控件,主要是用来实现模糊查询和自由输入功能,然而由于长时间没用了,一阵手忙脚乱的,这里把网上收集的一部分教程 ...
- 《C++程序设计语言(英文第四版)》【PDF】下载
<C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...
- 【OS】NMON的简介和使用
[OS]NMON的简介和使用 目前NMON已开源,以sourceforge为根据地,网址是http://nmon.sourceforge.net. 1. 目的 本文介绍操作系统监控工具Nmon的概念. ...
- 【Python】【BugList13】req = requests.get(url=target)报错: (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)')
[代码] # -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'https://unsplash.co ...
- 【翻译】Flume 1.8.0 User Guide(用户指南) Processors
翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...
- 【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
随机推荐
- gradle build scan 插件使用
1. 添加插件 build.gradle plugins { id 'com.gradle.build-scan' version '1.10.2' } buildScan { // Uncommen ...
- uGUI知识点剖析之RectTransform
http://www.2fz1.com/post/unity-ugui-recttransform/#jtss-tsina uGUI知识点剖析之RectTransform 一.基本要点 RectTra ...
- guaua学习,工具专题
Preconditions 1,http://www.cnblogs.com/peida/p/Guava_Preconditions.html 1 .checkArgument(boolean) : ...
- 14.Python使用Pillow教程
1.打算开始学习PIL,在命令行输入:pip3 install PIL,报错信息如下所示,后百度了下,发现:PIL仅支持到Python2.7,后来一群志愿者在此基础上创建了兼容性版本,为Pillow, ...
- laravel 环境自编译过程
[原创] 看到此文的朋友看完后也许会失望,但我尽最大努力不让搜友们失望,以下是自己操作的笔记用以整理提高 虽然 laravel 官方已给出了安装 laravel 框架所需的环境盒子 使用Vagrant ...
- mysql server id一样导致报错
(root@localhost) 16:03:38 [(none)]> show slave status \G; Last_IO_Errno: 1593 Last_IO_Error: Fata ...
- python学习 (三十) python的函数
1: 函数参数默认值 def method1(p1 = , p2 = ): // 函数有两个参数,并且都有默认值 return p1 + p2 print(method1()) print(meth ...
- 关于Struts2配置文件名修改的问题
突发奇想的想知道Struts2的配置文件名是否可以修改,自己最早使用Struts2的时候,只是单纯的将配置文件命名为“struts.xml”,这是Strut2默认的配置文件名,我一直也没有去修改它的命 ...
- linux 利用nethogs查看某进程的网卡流量
一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...
- swoole学习
<?php ini_set('default_socket_timeout', -1); class serverEmail { public $serv = null; public func ...