poj 2750(线段树的动态规划)

Potted Flower

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 4186   Accepted: 1581

Description

The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of flowers. Each potted flower will be assigned to an integer number (possibly negative) denoting how attractive it is.
See the following graph as an example:

(Positions of potted flowers are assigned to index numbers in the range of 1 ... N. The i-th pot and the (i + 1)-th pot are consecutive for any given i (1 <= i < N), and 1st pot is next to N-th pot in addition.)

The board chairman informed the little cat to construct "ONE arc-style cane-chair" for tourists having a rest, and the sum of attractive values of the flowers beside the cane-chair should be as large as possible. You should notice that a cane-chair cannot be
a total circle, so the number of flowers beside the cane-chair may be 1, 2, ..., N - 1, but cannot be N. In the above example, if we construct a cane-chair in the position of that red-dashed-arc, we will have the sum of 3+(-2)+1+2=4, which is the largest among
all possible constructions.

Unluckily, some booted cats always make trouble for the little cat, by changing some potted flowers to others. The intelligence agency of little cat has caught up all the M instruments of booted cats‘ action. Each instrument is in the form of "A B", which means
changing the A-th potted flowered with a new one whose attractive value equals to B. You have to report the new "maximal sum" after each instruction.

Input

There will be a single test data in the input. You are given an integer N (4 <= N <= 100000) in the first input line.

The second line contains N integers, which are the initial attractive value of each potted flower. The i-th number is for the potted flower on the i-th position.

A single integer M (4 <= M <= 100000) in the third input line, and the following M lines each contains an instruction "A B" in the form described above.

Restriction: All the attractive values are within [-1000, 1000]. We guarantee the maximal sum will be always a positive integer.

Output

For each instruction, output a single line with the maximum sum of attractive values for the optimum cane-chair.

Sample Input

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

Sample Output

4
4
3
5

Source

POJ Monthly--2006.01.22,Zeyuan Zhu

正常看得懂吧,代码有点小解释。

AC代码:

#include<algorithm>
#include<stdio.h>
#include<iostream>
using namespace std;
struct Node{
    int left,right;
    int mx,mn,sum;
    int nmx,nmn,rmx,lmx,rmn,lmn;
}a[400010];
void push(int cur){
    a[cur].mn=min(a[cur<<1].mn,a[cur<<1|1].mn);    //最小值
    a[cur].mx=max(a[cur<<1].mx,a[cur<<1|1].mx);    //最大值
    a[cur].sum=a[cur<<1].sum+a[cur<<1|1].sum;      //和

    a[cur].rmx=max(a[cur<<1|1].rmx,a[cur<<1].rmx+a[cur<<1|1].sum);   //从右向左的最大连续和
    a[cur].lmx=max(a[cur<<1].lmx,a[cur<<1].sum+a[cur<<1|1].lmx);     //从左向右的最大连续和

    a[cur].rmn=min(a[cur<<1|1].rmn,a[cur<<1].rmn+a[cur<<1|1].sum);   //从右向左的最小连续和
    a[cur].lmn=min(a[cur<<1].lmn,a[cur<<1].sum+a[cur<<1|1].lmn);     //从左向右的最小连续和

    a[cur].nmx=max(max(a[cur<<1].nmx,a[cur<<1|1].nmx),a[cur<<1].rmx+a[cur<<1|1].lmx);    //最大连续和
    a[cur].nmn=min(min(a[cur<<1].nmn,a[cur<<1|1].nmn),a[cur<<1].rmn+a[cur<<1|1].lmn);    //最小连续和
}
void built(int cur,int x,int y){
    a[cur].left=x; a[cur].right=y;
    if(x==y){
        scanf("%d",&a[cur].sum);
        a[cur].mx=a[cur].mn=a[cur].nmx=a[cur].nmn=a[cur].rmx=a[cur].lmx=a[cur].rmn=a[cur].lmn=a[cur].sum;
        return ;
    }
    int mid=(x+y)>>1;
    built(cur<<1,x,mid);
    built(cur<<1|1,mid+1,y);
    push(cur);
}
void update(int cur,int x,int val){
    if(a[cur].left==x && x==a[cur].right){
        a[cur].sum=val;
        a[cur].mx=a[cur].mn=a[cur].nmx=a[cur].nmn=a[cur].rmx=a[cur].lmx=a[cur].rmn=a[cur].lmn=a[cur].sum;
        return ;
    }
    int mid=(a[cur].left+a[cur].right)>>1;
    if(x<=mid)
        update(cur<<1,x,val);
    else
        update(cur<<1|1,x,val);
    push(cur);
}
int main(){
    int n,m;
    scanf("%d",&n);
    built(1,1,n);
    scanf("%d",&m);
    while(m--){
        int x,val;
        scanf("%d%d",&x,&val);
        update(1,x,val);
        if(a[1].sum==a[1].nmx){
            printf("%d\n",a[1].sum-a[1].nmn);
        }
        else{
            printf("%d\n",max(a[1].nmx,a[1].sum-a[1].nmn));
        }
    }
    return 0;
}

poj 2750(线段树的动态规划)

时间: 2024-08-05 08:43:14

poj 2750(线段树的动态规划)的相关文章

POJ 2528 (线段树+离散化) Mayor&#39;s posters

因为将每个单位都作为一个最小单元的话会爆内存的 所以,将海报的每个端点进行排序,将这些端点最为最小的区间. 毕竟是刚刚接触线段树,理解起来还有些吃力,还是那句话,题做多了慢慢就好了. 萌萌的AC代码君贴上. 1 //#define LOCAL 2 #include <iostream> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 7 int n; 8 struct CPost 9

poj 2777 线段树的区间更新

Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Chosen Problem Solving and Program design as an optional course, you are required to solve al

转载::POJ 2991 线段树+计算几何(有c++结构体操作)

POJ 2991 线段树+计算几何 (2011-02-27 21:13:44) 转载▼ 标签: 杂谈 分类: OI 话说这一题真的是很恶心很恶心,不过确实改变了我对线段树的一些看法,算是很经典的题目. 题意:有一个吊车由很多个不同长度的线段组成,一开始是一条长直线起点在(0,0),尾节点在(0,sum[n]),每条线段之间的夹角的初始值是180度.然后有一些操作a. b将第a条线段和a+1之间的夹角变成b度,经过每一次操作都要求出尾节点的坐标. 首先要用到一个计算几何的知识(没学过..请教而来)

POJ 2570 线段树

Potted Flower Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description The little cat takes over the management of a new park. There is a large circular statue in

poj 2828 线段树

http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 并且后来的也可以确定----如果从前往后,所有的随时都不是确定的 2.线段树叶子节点直接维护区间(线段)信息,非叶子节点v维护的是以v为树根的整个子树的信息,那么假设父节点rt信息为[l,r]那么左子树维护[l,mid],右子树维护[mid+1,r]的信息.如果如果是前缀和,rt里是1-n的和,左子树1~n/2的和,右子树是n/2+1~n

POJ 3468 线段树+lazy标记

lazy标记 Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to

POJ 3667 线段树的区间合并简单问题

题目大意:有一排标号1-N的房间.操作一:询问是不是有连续长度为a的空房间,有的话住进最左边(占用a个房间)操作二:将[a,a+b-1]的房间清空(腾出b个房间)思路:记录每个区间中“靠左”“靠右”“中间”的空房间线段树操作:update:区间替换query:询问满足条件的最左端点 题目链接: http://vjudge.net/problem/viewProblem.action?id=10354 题目操作: 因为这里找从最左边住起的房间,所以这里不能像常规地写query函数那样写了,终于发现

poj 2886 线段树的更新+反素数

Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description N children are sitting in a circle to play a game. The children are numbered from

poj 3468 线段树成段更新

http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58132   Accepted: 17704 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two k