题目传送门(内部题116)


输入格式

  第一行两个整数$n,m$,如题
  第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$
  接下来有$m$行,每行两个整数,$p,H_p$,表示第$p$个位置的苹果实际高度为$H_p$。


输出格式

  输出共$m$行,每行一个整数,表示这种修改情况下的答案。


样例

样例输入:

5 3
1 2 3 4 4
1 5
5 5
2 3

样例输出:

1
5
3


数据范围与提示

样例解释:

  第一种情况 苹果高度为$5\ 2\ 3\ 4\ 4$,只摘第一个苹果
  第二种情况 苹果高度为$1\ 2\ 3\ 4\ 5$,陶陶会摘五个苹果
  第三种情况 苹果高度为$1\ 3\ 3\ 4\ 4$,所以会选择$1,2,4$号位置的苹果

数据范围:

  对于$20\%$的数据,$n,m\leqslant 5,000$
  对于$100\%$的数据,$n,m\leqslant 100,000$。


题解

做法很多,我的做法是线段树维护单调栈。

开场$20$分钟切,就是个板子,没什么好说的了……

时间复杂度:$\Theta(n\log^2n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
int n,m;
int a[200001];
int trmx[500001],trsm[500001];
int pushup(int x,int l,int r,int w)
{
if(l==r)return trmx[x]>w;int mid=(l+r)>>1;
if(trmx[L(x)]<=w)return pushup(R(x),mid+1,r,w);
return trsm[x]-trsm[L(x)]+pushup(L(x),l,mid,w);
}
void pushup(int x,int l,int r)
{
if(trmx[L(x)]<=trmx[R(x)])trmx[x]=trmx[R(x)];
else trmx[x]=trmx[L(x)];int mid=(l+r)>>1;
trsm[x]=trsm[L(x)]+pushup(R(x),mid+1,r,trmx[L(x)]);
}
void add(int x,int l,int r,int k,int w)
{
if(l==r){trmx[x]=w;trsm[x]=1;return;}
int mid=(l+r)>>1;
if(k<=mid)add(L(x),l,mid,k,w);
else add(R(x),mid+1,r,k,w);
pushup(x,l,r);
}
pair<int,int> ask(int x,int l,int r,int k,int w)
{
if(l>n)return make_pair(0,0);
if(k<=l)return make_pair(max(w,trmx[x]),pushup(x,l,r,w));
int mid=(l+r)>>1;
if(mid<k)return ask(R(x),mid+1,r,k,w);
pair<int,int> flag=ask(L(x),l,mid,k,w);
pair<int,int> res=ask(R(x),mid+1,r,k,max(w,flag.first));
res.second+=flag.second;
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(1,1,n,i,a[i]);
}
for(int i=1;i<=m;i++)
{
int p,h;
scanf("%d%d",&p,&h);
add(1,1,n,p,h);
printf("%d\n",ask(1,1,n,1,0).second);
add(1,1,n,p,a[p]);
}
return 0;
}

rp++

[CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)的更多相关文章

  1. [CSP-S模拟测试]:God Knows(线段树维护单调栈)

    题目描述 小$w$来到天堂的门口,对着天堂的大门发呆.大门上有一个二分图,左边第$i$个点连到右边第$p_i$个点.(保证$p_i$是一个排列).小$w$每次可以找左边某个对应连线尚未被移除的点$i$ ...

  2. [CSP-S模拟测试]:联(小清新线段树)

    题目描述 由于出题人懒所以没有背景.一个无限长的$01$序列,初始全为$0$,每次选择一个区间$[l,r]$进行操作,有三种操作:$\bullet 1\ l\ r$将$[l,r]$中所有元素变成$1$ ...

  3. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  4. 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】

    题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...

  5. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  6. [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)

    陶陶的难题II 时间限制:40s      空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...

  7. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  8. [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)

    题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...

  9. [CSP-S模拟测试]:购物(柯朵莉树)

    题目描述 $visit_world$有一个商店,商店里卖$N$个商品,第$i$个的价格为$a[i]$我们称一个正整数$K$是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间$[K, ...

随机推荐

  1. python_0基础开始_day10

    第十节 一.函数进阶 动态参数 *a r g s —— 聚合位置参数,动态位置参数 默认返回的是tuple元组 def eat(*args):  # 函数的定义阶段 *聚合(打包)    print( ...

  2. 搞懂Redis复制原理

    前言 与大多数db一样,Redis也提供了复制机制,以满足故障恢复和负载均衡等需求.复制也是Redis高可用的基础,哨兵和集群都是建立在复制基础上实现高可用的.复制不仅提高了整个系统的容错能力,还可以 ...

  3. 数据绑定-POJO对象绑定参数

    测试: 效果:

  4. [转载]HTTP和HTTPS

    来源:https://blog.csdn.net/xiaoming100001/article/details/81109617 大纲 一.前言: 先来观察这两张图,第一张访问域名http://www ...

  5. 111、什么是stack (Swarm18)

    参考https://www.cnblogs.com/CloudMan6/p/8119150.html   什么是 stack ?    在将这个之前先回顾一下前面部署WordPress的过程:     ...

  6. 用java语言(文件和文件流知识点)实现图片的拷贝,从d盘拷贝到e盘

    /** * 实现图片的拷贝\ * 注意:用的是文件字节流 */ package com.test4; import java.io.*; public class Demo12_4 { /** * @ ...

  7. Django框架——基础之路由系统(urls.py)

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  8. vi编辑器中删除文件中所有字符

    在命令模式下,将光标移动到文档最上方(使用gg命令),然后输入dG,删除工作区内所有缓存数据. 如果想要删除某行文档以下的内容,将光标移动到文档相应行,然后输入dG即可.

  9. 利用SAX解析读取XML文件

    xml     这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读 ...

  10. 遗传算法解决寻路问题——Python描述

    概要 我的上一篇写遗传算法解决排序问题,当中思想借鉴了遗传算法解决TSP问题,本质上可以认为这是一类问题,就是这样认为:寻找到一个序列X,使F(X)最大. 详解介绍 排序问题:寻找一个序列,使得这个序 ...