点我看题目链接

题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的。

思路 :这个题比较那啥,差不多可以用DP的思想来解决这个问题,你在某个地方将这个环断开,因为线段树无法建成环形的。然后再去找那个最大值。将这个序列分成两部分,先求左边的最大连续和a,再求右边连续和b,但是由于他们中间相连的那部分,就是左部分的最右边的连续最大和x加上右部分的最左边的连续最大和y加起来可能比ab都大,但分开的话可能并没有a或b大。所以要进行区间合并,将y并到左边去,或者将x并到右边去,但本身那个边界不变

#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; const int maxn = ;
int maxx[maxn << ],minn[maxn << ] ;
int lmax[maxn << ],rmax[maxn << ] ;
int lmin[maxn << ],rmin[maxn << ] ;
int sum[maxn << ] ; void dp(int v)
{
int l = v << ,r = l+;
sum[v] = sum[l]+sum[r] ;
maxx[v] = max(max(maxx[l],maxx[r]),lmax[r] + rmax[l]) ;
minn[v] = min(min(minn[l],minn[r]),lmin[r] + rmin[l]) ;
lmax[v] = max(lmax[l],sum[l]+lmax[r]) ;
rmax[v] = max(rmax[r],sum[r]+rmax[l]) ;
lmin[v] = min(lmin[l],sum[l]+lmin[r]) ;
rmin[v] = min(rmin[r],sum[r]+rmin[l]) ;
}
void build(int v,int l,int r)
{
if(l == r)
{
scanf("%d",&sum[v]) ;
maxx[v] = minn[v] = lmax[v] = rmax[v] = lmin[v] = rmin[v] = sum[v] ;
return ;
}
int mid = (l+r) >> ;
build(v*,l,mid) ;
build(v*+,mid+,r) ;
dp(v) ;
}
void update(int v,int l,int r,int num,int value)
{
if(l == r)
{
sum[v] = maxx[v] = minn[v] = value ;
lmax[v] = rmax[v] = lmin[v] = rmin[v] = value ;
return ;
}
int mid = (l+r) >> ;
if(mid >= num) update(v*,l,mid,num,value) ;
else update(v*+,mid+,r,num,value) ;
dp(v) ;
} int main()
{
int n ;
while(~scanf("%d",&n))
{
build(,,n) ;
int m ;
scanf("%d",&m) ;
while(m--)
{
int x,y ;
int ans ;
scanf("%d %d",&x,&y) ;
update(,,n,x,y) ;
if(sum[] == maxx[])
ans = sum[]-minn[] ;
else
ans = max(maxx[], sum[]-minn[]) ;
printf("%d\n",ans) ;
}
}
return ;
}

POJ 2750 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. 线段树:CDOJ1592-An easy problem B (线段树的区间合并)

    An easy problem B Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  5. 线段树的区间合并 B - LCIS

    B - LCIS HDU - 3308 这个是一个很简单很明显的线段树的区间合并,不过区间合并的题目都还是有点难写,建议存个板子. #include <cstdio> #include & ...

  6. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  7. CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)

    题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...

  8. (简单) POJ 2750 Potted Flower,环+线段树。

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

  9. POJ 2750 Potted Flower

    Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3872   Accepted: 1446 Des ...

随机推荐

  1. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  2. print之模块化

    这里参考特权同学的模块化思想,将常用的print等任务模块化,便于直接调用,提高代码的效率和易读性.现转载之,以供日后的学习和工作参考. print模块参考代码如下: //============== ...

  3. volatile--共享数据必须保证可见性

    在Effective Java中看到的,试了一下,有点意思,考查的知识点是volatile关键字. 下面这段代码,预期是打印it takes xxxx miliseconds. .但实际上,陷入了死循 ...

  4. [ lucene高级 ] 研讨如何进行Lucene的分布式应用

    http://www.cnblogs.com/huangfox/archive/2010/10/15/1852206.html Lucene是个高度优化的倒转索引搜索引擎.它将倒转的索引存储在定制的文 ...

  5. swift入门-day01

    Swift 简介 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工 ...

  6. 记一次ios使用OAuth 2.0写的接口获取token的小错

    1.用ios原生网络请求的话,请求参数不能这样传 而要这样传 2.用afnetworking的话,要注意各个参数有没有错误,参数可以直接这样传

  7. Sdut 2164 Binomial Coeffcients (组合数学) (山东省ACM第二届省赛 D 题)

    Binomial Coeffcients TimeLimit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入 输出 示例输入 1 1 10 2 9 ...

  8. C++实现一个多线程同步方式的协同工作程序示例

    多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有 ...

  9. 24种设计模式--状态模式【State Pattern】

    现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城市可以纵向延伸 ...

  10. linux下启动和关闭网卡命令

    ifup.ifdown:linux命令   实时地手动修改一些网络接口参数,可以利用ifconfig来实现,如果是要直接以配置文件,亦即是在 /etc/sysconfig/network-script ...