题目描述

博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N。每一个巨石有一个海拔高度。而这个山脉又在一个盆地中,盆地里可能会积水,积水也有一个海拔高度,所有严格低于这个海拔高度的巨石,就会在水面下隐藏。

由于地壳运动,巨石的海拔高度可能会随时变化,每次一块的巨石会变成新的海拔高度。当然,水面的高度也会随时发生变化。

因为有这样奇妙的地质奇观,吸引了很多游客来游玩。uim作为一个游客,可以告诉你此时水位海拔,你得告诉他,能看到有几个连续露出水面的部分。(与水面持平我们也认为是露出)

输入输出格式

输入格式:

第一行两个整数N和M,分别表示N块石头,M个询问。

接下来一行,N个整数Ai表示每个巨石的初始海拔。

接下来M行,每行有两个或者三个数,每一行如果第一个数是1,那么后面跟一个Bj,表示水面海拔。如果第一个数是2,后面跟两个整数,Cj和Dj,表示编号Cj的巨石海拔变为Dj。

输出格式:

对于每个"1"询问,给出一个整数答案,也就是露出了几部分的山峰。

输入输出样例

输入样例#1:

5 4
8 6 3 5 4
1 5
2 4 1
1 5
1 3
输出样例#1:

2
1
2

说明

10%的数据, N,M<=2000

另外30%的数据, 只有"1"的询问。

100%的数据, 1<=N,M<=200000,1<=Ai,Bj,Dj<=10^9,一定有"1"询问

题解

话说模拟赛的时候这题打个暴力骗了50分

然后去网上找题解的时候愣是没一个能看懂的

最后找了份代码瞪了三个小时才明白是怎么回事

还是来详细的讲讲好了

首先,考虑暴力,扫一遍数组,如果$h[i-1]<H<=h[i]$,那么就++ans

然后我们先撇开询问不管,根据上述式子可以得出,如果$h[i-1]<h[i]$,那么$(h[i-1],h[i]]$之间的答案都会加一,这是一个典型的区间修改,我们可以用线段树实现

最后,考虑询问和修改。询问的话,直接在线段树上单点查询。至于修改操作,我们可以发现,一个点被修改之后,和$h[i-1]$以及$h[i+1]$之间的关系发生改变,影响了答案,所以改之前把之前答案的影响删去就好

ps:最后有个小细节,我们是按高度建线段树,所以必须进行离散

 // luogu-judger-enable-o2
//minamoto
#include<bits/stdc++.h>
#define N 400005
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
int sum[N<<|],tag[N<<|];
struct node{
int h,id;
inline bool operator <(const node &b)const
{return h<b.h;}
}a[N<<|];
int h[N<<|],x[N<<|],k[N<<|];
int n,m,mx;
void pushdown(int p){
if(!tag[p]) return;
int lson=p<<,rson=p<<|;
sum[lson]+=tag[p],sum[rson]+=tag[p];
tag[lson]+=tag[p],tag[rson]+=tag[p];
tag[p]=;
}
void change(int p,int l,int r,int ql,int qr,int x){
if(ql<=l&&qr>=r){
sum[p]+=x,tag[p]+=x;return;
}
pushdown(p);
int mid=(l+r)>>;
if(ql<=mid) change(p<<,l,mid,ql,qr,x);
if(qr>mid) change(p<<|,mid+,r,ql,qr,x);
}
int query(int p,int l,int r,int x){
if(l==r) return sum[p];
pushdown(p);
int mid=(l+r)>>;
if(x<=mid) return query(p<<,l,mid,x);
else return query(p<<|,mid+,r,x);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i)
a[i].h=read(),a[i].id=i;
for(int i=n+;i<=n+m;++i){
k[i]=read();
if(k[i]==) x[i]=read();
a[i].h=read();
a[i].id=i;
}
sort(a+,a++n+m);h[a[].id]=;
for(int i=;i<=n+m;++i)
h[a[i].id]=a[i].h>a[i-].h?h[a[i-].id]+:h[a[i-].id];
mx=h[a[n+m].id];
for(int i=;i<=n;++i)
if(h[i-]<h[i]) change(,,mx,h[i-]+,h[i],);
for(int i=n+;i<=n+m;++i){
if(k[i]==){
int t=x[i];
if(h[t-]<h[t])change(,,mx,h[t-]+,h[t],-);
if(t!=n&&h[t]<h[t+])change(,,mx,h[t]+,h[t+],-);
h[t]=h[i];
if(h[t-]<h[t])change(,,mx,h[t-]+,h[t],);
if(t!=n&&h[t]<h[t+])change(,,mx,h[t]+,h[t+],); }
else printf("%d\n",query(,,mx,h[i]));
}
return ;
}

洛谷P3616 富金森林公园的更多相关文章

  1. 洛谷 P3616 富金森林公园题解(树状数组)

    P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...

  2. 树状数组 洛谷P3616 富金森林公园

    P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...

  3. 洛谷 P3616 富金森林公园 [树状数组]

    传送门 维护一个山脉,单点修改,查询有多少山峰高出水面 我是沙茶沙茶题都不会做只想到无修改可以用扫描线 答案就是所有比水面高的-相邻都比水面高的啊 因为没有区间询问写个$BIT$都可以 有区间询问?可 ...

  4. ●洛谷 P3616 富金森林公园

    题链: https://www.luogu.org/problemnew/show/3616 题解: 树状数组,,, 本题思路挺巧妙. 考虑这种暴力算法:(设H[i]为i位置的高度,水面的高度为B) ...

  5. 【树状数组 思维题】luoguP3616 富金森林公园

    树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...

  6. Luogu P3616 【富金森林公园】

    我们首先考虑一块石头高度变化对每个高度的查询的答案的影响, 即我们要记录,对于每个高度的查询的答案 所以要离散化高度(不然哪开的下数组啊) 不难发现,一次变化的对于不同高度的影响,对于一段连续高度是相 ...

  7. 【洛谷】P1064 金明的预算方案(dp)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  8. Luogu 3616 富金森林公园

    刚看到此题的时候:sb分块??? Rorshach dalao甩手一句看题 于是回去看题……果然是题读错了…… [思路] 对权值离散化后(要先读入所有输入里的权值一起离散化……所以一共有4e4个数据( ...

  9. 洛谷 P1477 [NOI2008]假面舞会

    题目链接 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方 ...

随机推荐

  1. java中的==、equals()、hashCode()

    java中的==.equals().hashCode()源码分析 在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中 ...

  2. java程序员应该熟悉的20个有用的库(转)

    优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...

  3. spring4-2-bean配置-2-属性注入细节

    配置 bean,本章节中主要介绍蓝色文字部分. 配置形式:基于 XML 文件的方式:基于注解的方式 Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).F ...

  4. Luogu 4725 【模板】多项式对数函数

    继续补全模板. 要求 $$g(x) = ln f(x)$$ 两边求导, $$g'(x) = \frac{f'(x)}{f(x)}$$ 然后左转去把多项式求导和多项式求逆的模板复制过来,就可以计算出$g ...

  5. 封装request.get_params批量取值

    @json_request_validator(post_schema) 装饰器 from functools import wraps from schema import SchemaError ...

  6. es-文档版本号,操作类型,分片选择

    一.版本号: 在es中每个文档都有一个版本号,默认情况下,版本号都是随着每次对该文档的修改或者删除自增的,当然你也可以自己指定.有了这个文档号,我们可以像mysql 乐观锁一样,用来进行控制字我们文档 ...

  7. WCF和ASP.NET Web API在应用上的选择(转)

    出处:http://www.cnblogs.com/shanyou/archive/2012/09/26/2704814.html 在最近发布的Visual Studio 2012及.NET 4.5中 ...

  8. 【转】Java虚拟机详解----常用JVM配置参数

    原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html 本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: ...

  9. 我的BootStrap学习笔记

    1.全局样式里面: 1.container:版心 2.col-xx-xx:栅格布局 3.btn btn-default: 按钮,默认按钮样式 4..pull-left  pull-right  cle ...

  10. [Lua快速了解一下]Lua的OOP

    __index(a, b) 对应表达式 a.b 上面我们看到有__index这个重载,这个东西主要是重载了find key的操作.这波操作可以让Lua变得有点面向对象的感觉,让其有点像Javascri ...