题目描述

博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从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:最后有个小细节,我们是按高度建线段树,所以必须进行离散

 1 // luogu-judger-enable-o2
 2 //minamoto
 3 #include<bits/stdc++.h>
 4 #define N 400005
 5 using namespace std;
 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<15],*p1=buf,*p2=buf;
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 int sum[N<<2|1],tag[N<<2|1];
19 struct node{
20     int h,id;
21     inline bool operator <(const node &b)const
22     {return h<b.h;}
23 }a[N<<1|1];
24 int h[N<<1|1],x[N<<1|1],k[N<<1|1];
25 int n,m,mx;
26 void pushdown(int p){
27     if(!tag[p]) return;
28     int lson=p<<1,rson=p<<1|1;
29     sum[lson]+=tag[p],sum[rson]+=tag[p];
30     tag[lson]+=tag[p],tag[rson]+=tag[p];
31     tag[p]=0;
32 }
33 void change(int p,int l,int r,int ql,int qr,int x){
34     if(ql<=l&&qr>=r){
35         sum[p]+=x,tag[p]+=x;return;
36     }
37     pushdown(p);
38     int mid=(l+r)>>1;
39     if(ql<=mid) change(p<<1,l,mid,ql,qr,x);
40     if(qr>mid) change(p<<1|1,mid+1,r,ql,qr,x);
41 }
42 int query(int p,int l,int r,int x){
43     if(l==r) return sum[p];
44     pushdown(p);
45     int mid=(l+r)>>1;
46     if(x<=mid) return query(p<<1,l,mid,x);
47     else return query(p<<1|1,mid+1,r,x);
48 }
49 int main(){
50     //freopen("testdata.in","r",stdin);
51     n=read(),m=read();
52     for(int i=1;i<=n;++i)
53     a[i].h=read(),a[i].id=i;
54     for(int i=n+1;i<=n+m;++i){
55         k[i]=read();
56         if(k[i]==2) x[i]=read();
57         a[i].h=read();
58         a[i].id=i;
59     }
60     sort(a+1,a+1+n+m);h[a[1].id]=1;
61     for(int i=2;i<=n+m;++i)
62     h[a[i].id]=a[i].h>a[i-1].h?h[a[i-1].id]+1:h[a[i-1].id];
63     mx=h[a[n+m].id];
64     for(int i=1;i<=n;++i)
65     if(h[i-1]<h[i]) change(1,1,mx,h[i-1]+1,h[i],1);
66     for(int i=n+1;i<=n+m;++i){
67         if(k[i]==2){
68             int t=x[i];
69             if(h[t-1]<h[t])change(1,1,mx,h[t-1]+1,h[t],-1);
70             if(t!=n&&h[t]<h[t+1])change(1,1,mx,h[t]+1,h[t+1],-1);
71             h[t]=h[i];
72             if(h[t-1]<h[t])change(1,1,mx,h[t-1]+1,h[t],1);
73             if(t!=n&&h[t]<h[t+1])change(1,1,mx,h[t]+1,h[t+1],1);
74
75         }
76         else printf("%d\n",query(1,1,mx,h[i]));
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9369585.html

洛谷P3616 富金森林公园相关推荐

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

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

  2. [洛谷2月月月赛]富金森林公园

    题意:给定n个点的高度,支持修改和求高度大等于给定的值的连续的段数量.n<=100000 题解:段数=大等于高度的数量-相邻两个数的较小值大等于高度的数量.线段树或者树状数组 复杂度nlogn ...

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

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

  4. 洛谷2017-2月月赛

    打CF前随便打打,看了一眼只会做签到题,还挂了一次,95/400. A.富金森林公园 题目大意:给一个长度为n的数列,支持两种操作:1.修改一个数的值:2.给出一个k,问有多少段数大等于k.(N< ...

  5. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

    [题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...

  6. [动态规划] 洛谷P1064 金明的预算方案

    洛谷P1064 金明的预算方案 题意: 每件物品都有一定的满意度,而且物品分主件附件,要买附件就必须要买主件,但是买主件不一定要买附件(一个主件最多有两个附件,也可能没有喔) 设第j件物品的价格为v[ ...

  7. 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵

    洛谷 P5020货币系统 https://www.luogu.com.cn/problem/P5020 思路是把货币从小到大排序,然后按顺序依次完全背包dp,每次dp检查i-1种面值的货币能不能凑出第 ...

  8. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  9. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

最新文章

  1. Javaweb权限管理设计思路
  2. boost::graph::distributed用法的测试程序
  3. Zookeeper01_必看
  4. 《白鹿原》金句摘抄(七)
  5. CSS cursor 属性-鼠标形状
  6. 【活体检测】二分类活体检测评价方式
  7. 网页粒子背景插件 -Canvas-nest.js
  8. 【转】成为一名推荐系统工程师永远都不晚
  9. c语言a十六进制的地址,使用gdb调试c程序以显示十六进制地址
  10. Sun java认证考试真题答案及部分解析(一)
  11. java打包时打入本地依赖包
  12. 2020年5月份编程语言排行榜
  13. e5服务器系列天梯图,至强e5处理器天梯图_至强E5系列CPU排行榜高清图2020-win7之家...
  14. ERD Online 4.0.5 在线数据库建模、元数据管理(免费、私有部署)
  15. 地壳中元素含量排名记忆口诀_地壳中元素含量_地壳中元素含量口诀
  16. 公司账号服务单点登录到gitlab
  17. laravel 邮件发送
  18. 【数据结构】物流运输(最短路DP)
  19. 京东商城 最具争议的B2C
  20. 联想ideapad15s安装(烧录)ubuntu操作系统(双系统)

热门文章

  1. 全球与中国InGaAs光电二极管传感器市场投资机会与市场风险评估报告2022-2028年
  2. Nginx 优化详解
  3. beautifulsoup4
  4. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
  5. java爬虫之正则表达式
  6. Java使用Future设置方法超时
  7. yum安装Imagick及扩展
  8. C#遍历指定文件夹中的所有文件和子文件夹
  9. iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用
  10. 用DOS命令安装删除服务