zoukankan      html  css  js  c++  java
  • 小白逛公园(线段树)

    小白逛公园(线段树)

    题目背景

    小新经常陪小白去公园玩,也就是所谓的遛狗啦…

    题目描述

    在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。

    一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第aa个和第bb个公园之间(包括aa、bb两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。

    那么,就请你来帮小白选择公园吧。

    输入输出格式

    输入格式:

    第一行,两个整数NN和MM,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。
    接下来NN行,每行一个整数,依次给出小白 开始时对公园的打分。
    接下来MM行,每行三个整数。第一个整数KK,11或22。

    • K=1K=1表示,小新要带小白出去玩,接下来的两个整数aa和bb给出了选择公园的范围(1≤a,b≤N1a,bN)。测试数据可能会出现a>ba>b的情况,需要进行交换;
    • K=2K=2表示,小白改变了对某个公园的打分,接下来的两个整数pp和ss,表示小白对第pp个公园的打分变成了ss(1≤p≤N1pN)。
      其中,1≤N≤500 0001N500000,1≤M≤100 0001M100000,所有打分都是绝对值不超过10001000的整数。

    输出格式:

    小白每出去玩一次,都对应输出一行,只包含一个整数,表示小白可以选出的公园得分和的最大值。

    输入输出样例

    输入样例#1: 

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

    输出样例#1: 

    2
    -1

    小白逛公园思路:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define inf -999999999
    using namespace std;
    int a[505000],n,m;
    struct zlk{
        int ls,rs,s,wyx;
    };
    struct Segment_Tree{
        int lsum[4005000],rsum[4005000],sum[4005000],yx[4005000];
        void push_up(int k){
            lsum[k]=max(lsum[k<<1],sum[k<<1]+lsum[(k<<1)|1]);
            rsum[k]=max(rsum[(k<<1)|1],sum[(k<<1)|1]+rsum[k<<1]);
            sum[k]=sum[k<<1]+sum[(k<<1)|1];
            yx[k]=max(lsum[(k<<1)|1]+rsum[k<<1],max(yx[k<<1],yx[(k<<1)|1]));
        }
        void pre(int k,int l,int r){
            yx[k]=lsum[k]=rsum[k]=inf;
            sum[k]=0;
            if(l==r){
                yx[k]=lsum[k]=rsum[k]=sum[k]=a[l];
                return;
            }
            int mid=(l+r)>>1;
            pre(k<<1,l,mid);pre((k<<1)|1,mid+1,r);
            push_up(k);
        }
        void pls(int k,int l,int r,int x,int y){
            if(l==r && l==x){
                lsum[k]=rsum[k]=sum[k]=yx[k]=y;
                return;
            }
            int mid=(l+r)>>1;
            if(mid>=x) pls(k<<1,l,mid,x,y);
            else pls((k<<1)|1,mid+1,r,x,y);
            push_up(k);
        }
        zlk find(int k,int l,int r,int x,int y){
            zlk ans1,ans2,ans;
            if(x<=l && r<=y){
                ans.s=sum[k]; ans.ls=lsum[k]; ans.rs=rsum[k]; ans.wyx=yx[k];
                return ans;
            }
            bool rr=0,t=0;
            if(l==r){
                ans.s=inf;ans.ls=inf;ans.rs=inf;ans.wyx=inf;
                return ans;
            } 
            int mid=(l+r)>>1;
            if(mid>=x)ans1=find(k<<1,l,mid,x,y),rr=1;
            if(mid<y) ans2=find((k<<1)|1,mid+1,r,x,y),t=1;
            if(rr && !t) return ans1;
            if(!rr) return ans2;
            ans.s=ans1.s+ans2.s;
            ans.ls=max(ans1.ls,ans1.s+ans2.ls);
            ans.rs=max(ans2.rs,ans2.s+ans1.rs);
            ans.wyx=max(ans1.wyx,max(ans2.wyx,ans1.rs+ans2.ls));
            return ans;
        }
    }Q;
    int main(){
        scanf("%d%d",&n,&m);
        rep(i,1,n) scanf("%d",&a[i]);
        Q.pre(1,1,n);
        int p,x,y;
        rep(i,1,m){
            scanf("%d%d%d",&p,&x,&y);
            if(p==2) Q.pls(1,1,n,x,y);
            else printf("%d
    ",Q.find(1,1,n,min(x,y),max(x,y)).wyx);
        }
        return 0;
    }

    完结撒花~~~~

  • 相关阅读:
    忘记秘密利用python模拟登录暴力破解秘密
    ubuntu16.04 install qtcreator
    ubuntu16.04 pip install scrapy 报错处理
    Ubuntu18.04 和ubuntu16.04 apt源更新
    Ubuntu16.04主题美化
    ubuntu16.04上vue环境搭建
    基于fastadmin快速搭建后台管理
    python生成linux命令行工具
    nvidia驱动自动更新版本后问题解决 -- failed to initialize nvml: driver/library version mismatch
    学会使用Google搜索
  • 原文地址:https://www.cnblogs.com/handsome-zlk/p/9862090.html
Copyright © 2011-2022 走看看