zoukankan      html  css  js  c++  java
  • luogu P4513 小白逛公园 |线段树

    题目描述

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

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

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

    输入格式

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

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

    输出格式

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


    线段树维护区间最大连续字段和


    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=5e5+5;
    inline int read(){
        int x = 0, f = 1; char ch = getchar();
        while(ch > '9' || ch < '0'){ if(ch == '-')f = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9'){ x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    struct Seg{
    	int l,r,val,lm,rm,ma;
    	#define l(x) tree[x].l
    	#define r(x) tree[x].r
    	#define val(x) tree[x].val
    	#define lm(x) tree[x].lm
    	#define rm(x) tree[x].rm
    	#define ma(x) tree[x].ma
    }tree[N<<2];
    #define ls p<<1
    #define rs p<<1|1
    #define mid ((l(p)+r(p))>>1)
    void pushup(int p){
    	val(p)=val(ls)+val(rs);
    	ma(p)=max(rm(ls)+lm(rs),max(ma(ls),ma(rs)));
    	lm(p)=max(lm(ls),val(ls)+lm(rs));
    	rm(p)=max(rm(rs),val(rs)+rm(ls));
    }
    void build(int p,int l,int r){
    	l(p)=l,r(p)=r;
    	if(l==r){ ma(p)=lm(p)=rm(p)=val(p)=read(); return; }
    	build(ls,l,mid);
    	build(rs,mid+1,r);
    	pushup(p);
    }
    void update(int p,int pos,int d){
    	if(l(p)==r(p)){ ma(p)=lm(p)=rm(p)=val(p)=d; return; }
    	if(pos<=mid)update(ls,pos,d);
    	else update(rs,pos,d);
    	pushup(p);
    }
    Seg query(int p,int l,int r){
    	if(l<=l(p)&&r(p)<=r)return tree[p];
    	if(r<=mid)return query(ls,l,r);
    	else if(l>mid)return query(rs,l,r);
    	else{
    		Seg t,t1=query(ls,l,r),t2=query(rs,l,r);
    		t.lm=max(t1.lm,t1.val+t2.lm);
    		t.rm=max(t2.rm,t2.val+t1.rm);
    		t.ma=max(max(t1.ma,t2.ma),t1.rm+t2.lm);
    		return t;
    	}
    }
    signed main(){
    	int n=read(),m=read();
    	build(1,1,n);
    	while(m--){
    		int k=read(),a=read(),b=read();
    		if(k==1){
    			if(a>b)swap(a,b);
    			printf("%d
    ",query(1,a,b).ma);
    		}else update(1,a,b);
    	}
    }
    
  • 相关阅读:
    【BZOJ1452】【JSOI2009】count
    【BZOJ1030】【JSOI2007】文本生成器
    【BZOJ2427】【HAOI2010】软件安装
    从【BZOJ4173】谈做题技巧
    小A的旅行(绿豆蛙的归宿)【期望DP】
    甜点 【多重背包】
    洛谷 [P1154] 奶牛分厩
    POJ [P2631] Roads in the North
    洛谷 [P3258] 松鼠的新家
    洛谷 [P3398] 仓鼠找sugar
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/13094242.html
Copyright © 2011-2022 走看看