题目传送门(内部题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. 如何用纯 CSS 绘制一个世界上不存在的彭罗斯三角形

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RyvgMZ 可交互视频教 ...

  2. 调用webService学习小结

    这段时间项目进行到了最后时刻,但是还有很多需求没有搞清楚,眼看deadline越来越近,压力也越来越大.现在我的主要工作是将别人开发好的一个系统给加载到我们系统中,使用的方法是通过webService ...

  3. 日常用User-Agent列表

    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET C ...

  4. mybatis-plus简单了解

    mybatis-plus入门了解和简单使用 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 特性: ...

  5. 为什么单线程的Redis却能支撑高并发

    Redis的高并发和快速原因 redis是基于内存的,内存的读写速度非常快: 核心是基于非阻塞的IO多路复用机制: redis是单线程的,反而省去了很多上下文切换线程的时间: 为什么Redis是单线程 ...

  6. 启动web项目报错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    解决: 在application.properties配置文件中的添加标红部分 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaosha?se ...

  7. 多线程的些许理解(平台x86,具体考虑linux,windows)

    多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...

  8. hashmap的hash方法源doc解读

    /** * Computes key.hashCode() and spreads (XORs) higher bits of hash * to lower. Because the table u ...

  9. traceback:让你更加灵活地处理python的异常

    异常 异常在python中是屡见不鲜了,程序在执行到某一行代码时,发现有问题,比如数组索引越界,变量没有定义啊等等,此时就会抛出异常 捕获异常 在python,一般都是使用try···except来对 ...

  10. 在vs上开发linux c++

    https://www.cnblogs.com/xylc/p/6533716.html?&from=androidqq https://www.jianshu.com/p/8b51a795cb ...