题目链接:点击打开链接

题目大意:给出n个数排成一个环。求环的最大连续子序列,不能是总序列

建一个线段树来求最大子序列假设仅仅是一个序列。那么求最大连续子序列非常easy,可是假设是一个环,那就要考虑断点的问题,由于结果可能是由左边一部分+右边一部分,这种结果用线段树没法统计到,所以须要转换一下:

求最大连续子序列 = 总和 - 最小连续子序列

那么题目就非常easy了,要统计出每一段的最大连续子序列,最小连续子序列和总和。

sum[rt] = sum[rt<<1] + sum[rt<<1|1] ;

max1[rt] = max( max(max1[rt<<1],max1[rt<<1|1]),rmax1[rt<<1]+lmax1[rt<<1|1] ) ; 最大连续子序列

min1[rt] = min( min(min1[rt<<1],min1[rt<<1|1]),rmin1[rt<<1]+lmin1[rt<<1|1] ) ; 最小连续子序列

lmax1[rt] = max(lmax1[rt<<1],sum[rt<<1]+lmax1[rt<<1|1]) ; 以左側开头的最大子序列

lmin1[rt] = min(lmin1[rt<<1],sum[rt<<1]+lmin1[rt<<1|1]) ; 以左側开头的最小子序列

rmax1[rt] = max(rmax1[rt<<1|1],sum[rt<<1|1]+rmax1[rt<<1]) ; 以右側开头的最大子序列

rmin1[rt] = min(rmin1[rt<<1|1],sum[rt<<1|1]+rmin1[rt<<1]) ; 以右側开头的最小子序列

有由于不能是所有的序列,那么能够分开考虑,假设全都是整数,最大连续子序列是总和,那么结果应该是总和-最小连续子序列,假设全是负数。那么结果应该是最大连续子序列,其它的为 max(max1[1],sum[1]-min1[1]))

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define root 1,n,1
#define int_rt int l,int r,int rt
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
int cl[1000000] , sum[1000000] ;
int max1[1000000] , min1[1000000] ;
int lmax1[1000000] , lmin1[1000000] ;
int rmax1[1000000] , rmin1[1000000] ;
void push_up(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1] ;
max1[rt] = max( max(max1[rt<<1],max1[rt<<1|1]),rmax1[rt<<1]+lmax1[rt<<1|1] ) ;
min1[rt] = min( min(min1[rt<<1],min1[rt<<1|1]),rmin1[rt<<1]+lmin1[rt<<1|1] ) ;
lmax1[rt] = max(lmax1[rt<<1],sum[rt<<1]+lmax1[rt<<1|1]) ;
lmin1[rt] = min(lmin1[rt<<1],sum[rt<<1]+lmin1[rt<<1|1]) ;
rmax1[rt] = max(rmax1[rt<<1|1],sum[rt<<1|1]+rmax1[rt<<1]) ;
rmin1[rt] = min(rmin1[rt<<1|1],sum[rt<<1|1]+rmin1[rt<<1]) ;
}
void creat(int_rt) {
if( l == r ) {
scanf("%d", &cl[rt]) ;
sum[rt] = max1[rt] = min1[rt] = lmax1[rt] = lmin1[rt] = rmax1[rt] = rmin1[rt] = cl[rt] ;
return ;
}
creat(lson) ;
creat(rson) ;
push_up(rt) ;
}
void update(int k,int s,int_rt) {
if( l == r ) {
cl[rt] = s ;
sum[rt] = max1[rt] = min1[rt] = lmax1[rt] = lmin1[rt] = rmax1[rt] = rmin1[rt] = cl[rt] ;
return ;
}
if( (l+r)/2 >= k )
update(k,s,lson) ;
else
update(k,s,rson) ;
push_up(rt) ;
}
int main() {
int n , m , i , k , s ;
while( scanf("%d", &n) != EOF ) {
creat(root) ;
scanf("%d", &m) ;
while( m-- ) {
scanf("%d %d", &k, &s) ;
update(k,s,root) ;
if( max1[1] == sum[1] )
printf("%d\n", sum[1]-min1[1]) ;
else if( min1[1] == sum[1] )
printf("%d\n", max1[1]) ;
else
printf("%d\n", max(max1[1],sum[1]-min1[1])) ;
}
}
return 0 ;
}

poj2750--Potted Flower(线段树)的更多相关文章

  1. POJ 2750 Potted Flower (线段树区间合并)

    开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并...  给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...

  2. POJ.2750.Potted Flower(线段树 最大环状子段和)

    题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最 ...

  3. POJ 2750 Potted Flower(线段树+dp)

    题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...

  4. Potted Flower(线段树+dp)

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

  5. [POJ2750]Potted Flower

    Description The little cat takes over the management of a new park. There is a large circular statue ...

  6. poj2750Potted Flower (线段树)

    http://poj.org/problem?id=2750 之前做过类似的题 把一段的左连续最大.最小 右连续最大及最小及中间的连续更新出 就可以算出这段最大的连续和 注意不能全部加上 加上一特判 ...

  7. poj2750 线段树 +DP Potted Flower

    问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列. 算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最 ...

  8. 【POJ 2750】 Potted Flower(线段树套dp)

    [POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4566   ...

  9. POJ 2750 Potted Flower(线段树的区间合并)

    点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...

随机推荐

  1. jdbc 接口学习笔记

    一.JDBC概念 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Jav ...

  2. 实体 和 XML格式的转换

    许多接口传输需要XML格式转换,那么如何实现?看下面帮助类→_→ /// <summary> /// XML处理帮助类,编码格式GBK!! /// </summary> pub ...

  3. MatLab之HDL coder

    1 Workflow The workflow for applying HDL code generation to the hardware design process requires the ...

  4. 本博客基本不再更新,请移步至我的CSDN博客

    本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08

  5. POST请求成功,但接口返回数据不正确

    事件:使用Jmeter做APP的搜索接口测试,请求成功了,但无论keyword是什么“内容”(这里的内容是带引号的哦),接口返回的内容都是:未匹配到搜索结果 排查问题: keyword=“世界” st ...

  6. Dart 调用C语言混合编程

    Dart 调用C语言本篇博客研究Dart语言如何调用C语言代码混合编程,最后我们实现一个简单示例,在C语言中编写简单加解密函数,使用dart调用并传入字符串,返回加密结果,调用解密函数,恢复字符串内容 ...

  7. 记Python学习

    上周学的Python,感觉有点忘了,现在回顾一下... 一.Python安装及测试:https://www.cnblogs.com/weven/p/7252917.html 例子: Python自带的 ...

  8. webpack command not found 的意外的坑 - 原因是从node开始

    写给自己做个记录: 弄了半天 执行了下面操作 npm install webpack -g 因为小白不懂原理,所以执行了好遍,结果还是如题, webpack command not found 网上搜 ...

  9. Day 20 python基础总复习

    一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...

  10. 51nod1256 乘法逆元【扩展欧几里得】

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...