码迷,mamicode.com
首页 > 其他好文 > 详细

P1427 小白逛公园

时间:2016-11-29 19:36:18      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:return   第一个   pre   hang   math   pac   ring   空间   space   

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

    小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。
    一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
    那么,就请你来帮小白选择公园吧。

输入格式

    第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。
    接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。
    接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。
    其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。

输出格式

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

测试样例1

输入

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

输出


-1

 

 

线段树结点维护:区间内最大答案,区间从左端开始的最大答案,从右端开始的最大答案,区间总和。

然后花式维护即可。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define lc rt<<1
 8 #define rc rt<<1|1
 9 using namespace std;
10 const int mxn=500010;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}
14     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
15     return x*f;
16 }
17 int n,m;
18 int data[mxn];
19 struct node{
20     int mx;
21     int ml,mr;
22     int smm;
23 }t[mxn<<2],tmp0;
24 void push_up(int l,int r,int rt){
25     t[rt].smm=t[lc].smm+t[rc].smm;
26     t[rt].mx=max(t[lc].mx,t[rc].mx);
27     t[rt].mx=max(t[lc].mr+t[rc].ml,t[rt].mx);
28     t[rt].ml=max(t[lc].ml,t[lc].smm+t[rc].ml);
29     t[rt].mr=max(t[rc].mr,t[rc].smm+t[lc].mr);
30     return;
31 }
32 void Build(int l,int r,int rt){
33     if(l==r){t[rt].mx=t[rt].ml=t[rt].mr=data[l];t[rt].smm=data[l];return;}
34     int mid=(l+r)>>1;
35     Build(l,mid,lc);
36     Build(mid+1,r,rc);
37     push_up(l,r,rt);
38     return;
39 }
40 void change(int p,int v,int l,int r,int rt){
41     if(l==r){
42         if(p==l){t[rt].ml=t[rt].mr=t[rt].mx=t[rt].smm=v;}
43         return;
44     }
45     int mid=(l+r)>>1;
46     if(p<=mid)change(p,v,l,mid,lc);
47     else change(p,v,mid+1,r,rc);
48     push_up(l,r,rt);
49     return;
50 }
51 node query(int L,int R,int l,int r,int rt){
52 //    printf("%d %d %d %d %d\n",L,R,l,r,rt);
53     if(L<=l && r<=R){return t[rt];}
54     int mid=(l+r)>>1;
55     node res1;
56     if(L<=mid)res1=query(L,R,l,mid,lc);
57         else res1=tmp0;
58     node res2;
59     if(R>mid)res2=query(L,R,mid+1,r,rc);
60         else res2=tmp0;
61     node res={0};
62     res.smm=res1.smm+res2.smm;
63     res.mx=max(res1.mx,res2.mx);
64     res.mx=max(res.mx,res1.mr+res2.ml);
65     res.ml=max(res1.ml,res1.smm+res2.ml);
66     res.mr=max(res2.mr,res2.smm+res1.mr);
67     return res;
68 }
69 int main(){
70     n=read();m=read();
71     int i,j,x,y,k;
72     for(i=1;i<=n;i++)data[i]=read();
73     Build(1,n,1);
74     tmp0.ml=tmp0.mr=tmp0.mx=-1e9;tmp0.smm=0;
75     for(i=1;i<=m;i++){
76         k=read();x=read();y=read();
77         if(k==1){
78             if(x>y)swap(x,y);
79             printf("%d\n",query(x,y,1,n,1).mx);
80         }
81         else change(x,y,1,n,1);
82     }
83     return 0;
84 }

 

P1427 小白逛公园

标签:return   第一个   pre   hang   math   pac   ring   空间   space   

原文地址:http://www.cnblogs.com/SilverNebula/p/6114803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!