问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出上的最大连续子段的和。

分析:涉及到线段树的以下操作:维护区间左边开始的连续最大子段和,从右边开始的连续最大子段和,区间的最大子段和

#include <iostream>
using namespace std;

#define MAXN 100005
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)

int n,m;

struct Node{
    int l,r,mx,lmx,rmx,mn,lmn,rmn,sum,mnnum;
    bool allpos;
}nod[3*MAXN];

void buildtree(int u,int l,int r){
    nod[u].l=l;
    nod[u].r=r;
    nod[u].lmx=INT_MIN;
    nod[u].rmx=INT_MIN;
    nod[u].mx=INT_MIN;
    nod[u].lmn=INT_MAX;
    nod[u].rmn=INT_MAX;
    nod[u].mn=INT_MAX;
    nod[u].sum=0;
    nod[u].mnnum=INT_MAX;
    nod[u].allpos=true;
    if(r==l)
        return;
    buildtree(2*u,l,(l+r)/2);
    buildtree(2*u+1,(l+r)/2+1,r);
}

void insert(int u,int l,int r,int val){
    if(nod[u].l==l && nod[u].r==r){
        nod[u].mx=val;
        nod[u].lmx=val;
        nod[u].rmx=val;
        nod[u].mn=val;
        nod[u].lmn=val;
        nod[u].rmn=val;
        nod[u].sum=val;
        nod[u].mnnum=val;
        if(val>=0)
            nod[u].allpos=true;
        else
            nod[u].allpos=false;
        return;
    }
    if(l<=nod[2*u].r)
        insert(2*u,l,r,val);
    if(r>=nod[2*u+1].l)
        insert(2*u+1,l,r,val);

nod[u].allpos=nod[2*u].allpos && nod[2*u+1].allpos;
    nod[u].sum=nod[2*u].sum+nod[2*u+1].sum;

nod[u].lmx=Max(nod[2*u].lmx,nod[2*u].sum+nod[2*u+1].lmx);
    nod[u].rmx=Max(nod[2*u+1].rmx,nod[2*u+1].sum+nod[2*u].rmx);

//nod[u].mx=Max(nod[2*u].rmx+nod[2*u+1].lmx,nod[2*u].mx,nod[2*u+1].mx);
    nod[u].mx=nod[2*u].rmx+nod[2*u+1].lmx;
    nod[u].mx=Max(nod[u].mx,nod[2*u].mx);
    nod[u].mx=Max(nod[u].mx,nod[2*u+1].mx);

nod[u].lmn=Min(nod[2*u].lmn,nod[2*u].sum+nod[2*u+1].lmn);
    nod[u].rmn=Min(nod[2*u+1].rmn,nod[2*u+1].sum+nod[2*u].rmn);

//nod[u].mn=Min(nod[2*u].rmn+nod[2*u+1].lmn,nod[2*u].mn,nod[2*u+1].mn);
    nod[u].mn=nod[2*u].rmn+nod[2*u+1].lmn;
    nod[u].mn=Min(nod[u].mn,nod[2*u].mn);
    nod[u].mn=Min(nod[u].mn,nod[2*u+1].mn);

nod[u].mnnum=Min(nod[2*u].mnnum,nod[2*u+1].mnnum);
    //环内最小的数,当环内元素全部为非负时用到
}

int main(){
    int i,pos,a,mn;
    while(scanf("%d",&n)!=EOF){
        buildtree(1,1,n);
        mn=INT_MAX;
        for(i=1;i<=n;i++){
            scanf("%d",&a);
            if(a<mn)
                mn=a;
            insert(1,i,i,a);
        }
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%d%d",&pos,&a);
            if(a<mn)
                mn=a;
            insert(1,pos,pos,a);
            if(nod[1].allpos)//当环内元素全为非负时
                printf("%d\n",nod[1].sum-nod[1].mnnum);
                //解为环和去掉最小的一个元素
            else
                printf("%d\n",Max(nod[1].sum-nod[1].mn,nod[1].mx));
                //解为环和减去最小子列和最大子列两者中的较大值
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/zgmf_x20a/archive/2008/11/12/1332275.html

pku2750 Potted Flower相关推荐

  1. Potted Flower(线段树+dp)

    http://poj.org/problem?id=2750 题意:在一个圈中取若干个相邻的数,求他们的最大序列和.不能够同时取所有的数. 看了一篇解题报告写的很详细..http://blog.csd ...

  2. POJ2750 Potted Flower (线段树+动态规划)

    题目链接:传送门 题意:题目的意思是说在一个环形的盆中选取连续的子区间使得价值/吸引力最大,然后我们有一种操作即将花盆A的吸引力替换为B(单点修改),然后每次修改输出吸引力的最大价值 解题思路:把环从 ...

  3. poj2750 PottedFlower(线段树的环状操作)

    题目:Potted Flower 大意:该你一个换环,求环上的最大连续的和(如果最大和包含所有数,要求减去最小的一个). 思路:这道题的思路并不难,需要在线段树里维护区间的最大和,最小和(应为是环状的 ...

  4. ICPC程序设计题解书籍系列之九:罗勇军《算法竞赛入门到进阶》

    罗书<算法竞赛入门到进阶>题目一览 第1章 算法竞赛概述 HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)( ...

  5. MYSQL圆角矩形表示_android 利用Bitmap获取圆角矩形、圆形图片

    1.在很多时候,我们要显示图片资源,需要将他的资源显示为圆角的:示例源码如下: public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,fl ...

  6. HDU - 6486 Flower(思维)

    HDU - 6486 Flower 题目大意:有n堆草每次只能对n-1堆操作每次只能减1问最少操作几次能把这些草剪到相同高度如果不能输出-1 我们让n-1个数减1实际上可以看成使得剩下的那一个数加1. ...

  7. flower.php,flowerlist.php

    require_once('nav.php'); ?> $sql = 'select * from flower'; $result = fetch_array($sql); ?> 鲜花列 ...

  8. BabyXor flower逆向寒假生涯(19/100)

    BabyXor 拖进ida后查看 判断长度是否等于0x17,不等于直接退出.长度等于0x17后再近一步判断. 首先经过一个MD5加密, 然后在经过一个enc函数变换, 进入enc看看 简单变化,找出数 ...

  9. Celery + Flower + FastAPI + RabbitMQ ,Python实现异步消息队列和监控

    @Author:Runsen 消息队列 消息队列让应用程序在用户请求之外异步执行称为任务的工作.如果应用程序需要在后台执行工作,它会将任务添加到任务队列中.这些任务稍后由工作服务执行. Celery ...

最新文章

  1. 莫德友_去哪儿酒店交易系统架构实践
  2. laravel 5.8 guzzle get 参数_Laravel速查表 Cache Cookie Request
  3. Python怎么安装第三方库-numpy-libnum等; (详细版)
  4. Android界面编程--使用活动条(ActionBar)--通过ActionBar菜单改变TextView的字体和颜色...
  5. 文档视图结构下多视图间的控制
  6. liunx java font_Linux下JDK中文字体乱码 | 学步园
  7. (Docker实战) 第4篇:Centos7 拉取和部署Redis
  8. python实例 91,92,93,94
  9. C ++入门系列博客一 最初的起点 — Hello World
  10. 六石管理学:谈管理的前提,要有一点的胸量
  11. atitit.javascript js 上传文件的本地预览
  12. XXXfragment that is not a fragment错误,fragment认不出来
  13. csdn 登录经常卡住无法登录
  14. linux创建文件夹操作步骤,linux如何用命令创建新建文件夹
  15. Concurrency in C# Cookbook中文翻译 :c#的并发烹饪书
  16. Java实现局域网流量监控
  17. 终于找到了!AI学习路线图——从零基础到就业
  18. 世界七大数学难题——千年大奖问题(转载)
  19. 受了点小伤,心情怎么就变坏了呢?
  20. 笑cry!在镜子面前,沉稳暖心的金毛同学也会瞬间化身逗比!

热门文章

  1. python没有错误但是不显示结果_python运行不报错又无任何结果输出
  2. 降采样_嫦娥五号探测器圆满完成我国首次月球采样返回任务
  3. uniapp 开发h5 优化加载速度
  4. linux查看native进程,Android 分析应用程序占用native内存
  5. mysql recordcount 1_[转载]ADO记录集GetRecordCount()返回记录条数为啥总为-1
  6. 2019安装软件安装管家_【软件安装管家】Br 2019软件安装包+安装教程
  7. android返回页面代码实现,Intent携带信息返回上一个界面实现基本信息的设置
  8. android 字体加粗有阴影,Android TextView高级显示技巧实例小结
  9. linux qt usb转串口通信,centos7 Qt USB转串口通信
  10. 不会部署并调试SpringBoot源码?一看必会IDEA操作