• 洛谷P3616 富金森林公园


    题目描述

    博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从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
    ",query(1,1,mx,h[i]));
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    【MySQL】(三)文件
    【MySQL】(二)InnoDB存储引擎
    Linux Shell脚本编程-信号捕获
    Linux Shell脚本编程-数组和字符串处理
    Linux Shell脚本编程-函数
    Linux Shell脚本编程-语句控制
    Linux Shell脚本编程-基础2
    Linux Shell脚本编程-基础1
    Awk
    Sed
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9369585.html
Copyright © 2020-2023  润新知