HDU 4960 Handling the past 2014 多校9 线段树
首先确定的基本思想是按时间离散化后来建线段树,对于每个操作插入到相应的时间点上
但是难就难在那个pop操作,我之前对pop操作的处理是找到离他最近的那个点删掉,但是这样对于后面的peak操作,如果时间戳还在pop前面,那就需要还原之前的pop操作,这弄得很不方便
于是就有了一种类似扫描线的做法,对于push操作+1,pop操作-1,对于每次peak操作,从他这点往左走,找到第一个>0的点即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int N = 50010;
int sum[N<<2],rsum[N<<2];
int d[N<<2];
int q[N],A[N],tmp[N],t[N];
int n;
void build(int rt,int l,int r)
{
sum[rt]=rsum[rt]=0;
if (l>=r){
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void up(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
rsum[rt]=max(rsum[rt<<1|1],sum[rt<<1|1]+rsum[rt<<1]);
}
void update(int val,int pos,int loc,int rt,int l,int r)
{
if (l>=r){
sum[rt]=val;
rsum[rt]=val;
if (val>0) d[rt]=A[loc];
//if (val<0) rsum[rt]=0;
return;
}
int mid=(l+r)>>1;
if (pos<=mid)
update(val,pos,loc,lson);
else
update(val,pos,loc,rson);
up(rt);
}
int s;
int query(int pos,int rt,int l,int r)
{
if (r<=pos){
if (s+rsum[rt]<=0){
s+=sum[rt];
return -1;
}
}
if (l>=r){
return d[rt];
}
int mid=(l+r)>>1;
if (pos<=mid) return query(pos,lson);
int res=-1;
res=query(pos,rson);
if (res!=-1) return res;
return query(pos,lson); }
int main()
{
char str[10];
int kase=0;
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
for (int i=1;i<=n;i++){
scanf("%s",str);
if (str[1]=='u'){
q[i]=1;
scanf("%d%d",&A[i],&tmp[i]);
}
else
if (str[1]=='o'){
q[i]=2;
scanf("%d",&tmp[i]);
}
else{
q[i]=3;
scanf("%d",&tmp[i]);
}
t[i]=tmp[i];
}
printf("Case #%d:\n",++kase);
sort(t+1,t+1+n);
for (int i=1;i<=n;i++){
int pos=lower_bound(t+1,t+1+n,tmp[i])-t;
tmp[i]=pos;
//cout<<tmp[i]<<endl;
}
build(1,1,n);
for (int i=1;i<=n;i++){
if (q[i]==1){
update(1,tmp[i],i,1,1,n);
}
else
if (q[i]==2){
update(-1,tmp[i],i,1,1,n);
}
else{
if (tmp[i]<=1){
printf("-1\n");
continue;
}
s=0;
int ans=query(tmp[i]-1,1,1,n);
printf("%d\n",ans);
}
}
}
return 0;
}
HDU 4960 Handling the past 2014 多校9 线段树的更多相关文章
- HDU 4893 2014多校三 线段树
给定一个初始都为0的序列,有三种操作,前两种比较正常,一个是对某个位置的数add k,另一个是query区间和.然后比较麻烦的是第三个操作,把某个区间里面的每个值改成离它最近的Fibonacci数,如 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4819 Mosaic(13年长春现场 二维线段树)
HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
- HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)
2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...
- HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4869 Turn the pokers (2014 多校联合第一场 I)
HDOJ--4869--Turn the pokers[组合数学+快速幂] 题意:有m张扑克,开始时全部正面朝下,你可以翻n次牌,每次可以翻xi张,翻拍规则就是正面朝下变背面朝下,反之亦然,问经过n次 ...
随机推荐
- Apache Shiro安全(权限框架)学习笔记二
课程目标 通过学习本课程掌握权限管理的设计思想及方法,使用Shiro框架完成权限管理功能开发. 1. 理解基于资源的权限管理方法. 2. 掌握权限管理的数据模型. 3. 掌握不使用shiro开发 ...
- Mybatis的逆向工程以及Example的实例函数及详解
Mybatis-generator是Mybatis的逆向工程 (根据数据库中的表生成java代码) Mybatis的逆向工程会生成实例及实例对应的example,example用于添加条件,相当于w ...
- Mayor's posters-POJ2528 区间染色+离散化
题意: 在一面长度为10000000 的墙上贴广告,告诉你每张海报的l,r(1 <= li <= ri <= 10000000.),让你求最后有几张海报露出来 链接:http://p ...
- c++多态性及多态的内部实现(翁恺c++公开课[23-24])
多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...
- LeetCode167. Two Sum II - Input array is sorted(双指针)
题意:对于一个有序数组,输出和为target的两个元素的下标.题目保证仅有唯一解. 分析: 法一:二分.枚举第一个元素,二分找另一个元素,时间复杂度O(nlogn),非最优解. class Solut ...
- 8个问题全面了解5G关键技术Massive MIMO
1 什么是Massive MIMO Massive MIMO(大规模天线技术,亦称为Large Scale MIMO)是第五代移动通信(5G)中提高系统容量和频谱利用率的关键技术.它最早由美国贝尔实验 ...
- java使用netty模拟实现一个类dubbo的分布式服务调用框架
本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...
- H.264 中的Annex B格式和AVCC格式
首先要理解的是没有标准的H.264基本流格式.文档中的确包含了一个Annex,特别是描述了一种可能的格式Annex B格式,但是这个并不是一个必须要求的格式.标准文档中指定了视频怎样编码成独立的包,但 ...
- 利用kali自带的msfvenom工具生成远程控制软件(木马)
2.生成一个简单的木马 3. 4. 5. 6.接下来生成的winx64muma.exe实际演示 7.将生成的winx64muma.exe在受害者机器上运行 8.在kali下输入msfconsole 9 ...
- pip使用镜像的方法
http://e.pypi.python.org/这个就是官网了,清华大学提供的 建议非清华大学校内的使用这个镜像: http://e.pypi.python.org/simple(这也是一个http ...