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

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

#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. JS --正则表达式验证、实战之邮箱模式
  2. 技术扫盲:关于低代码编程的可持续性交付设计和分析
  3. vue中使用Base64编码和解码
  4. 8786:方格取数 (多线程dp)
  5. Window_Open详解
  6. Visual Studio 2010授权修改
  7. python赋值语句的作用_Python之语句与函数
  8. linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)
  9. 将现有企业级模板项目从 Visual Studio .NET 2003 迁移到 Visual Studio 2005
  10. 抖音APP终极瘦身方案
  11. js实现23种设计模式
  12. CCNA之EIGRP(IGRP)
  13. 从网上骂人言论看其浮躁无知的一面
  14. React Native Camera的新手教程
  15. 搭建一个颜值超高的发卡网站
  16. 最大公因数及其求解算法(GCD)
  17. HttpClient实战爬虫B站番剧
  18. C语言程序设计2009版张磊,C语言程序设计(第2版普通高等教育十一五国家级规划教材)...
  19. struts2.1.6的bug之空指针(与tomcat安装)
  20. 重庆邮电大学计算机硕士录取,2018年重庆邮电大学硕士研究生复试录取工作方案_计算机考研复试...

热门文章

  1. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
  2. signature=12e3283d637b587235bcb4cbbfa1a5b3,A pathogen-inducible endogenous siRNA in plant immunity
  3. 余弦函数导数推导过程_对三角函数深入理解以及换元法的应用
  4. excel日期格式改不了_画进度计划横道图,Excel就够了
  5. java吃豆人代码讲解_在吃豆人的这一关里,隐藏着来自程序员的深深恶意
  6. tp5.0 php版本,ThinkPHP v5.0.2官方下载-ThinkPHP v5.0.2 完整版官方最新版-东坡下载
  7. 中如何构造有参和无惨_混凝土二次构造柱输送泵可提升施工效率
  8. css3转换图形展示,CSS3的常见transformation图形变化用法小结
  9. mysql跨服务器链表_MySQL 源码链表的实现
  10. 电脑应用程序错误怎么办_电脑Windows出错信息解析及解决方案