点我看题目链接

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

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

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. const int maxn = ;
  8. int maxx[maxn << ],minn[maxn << ] ;
  9. int lmax[maxn << ],rmax[maxn << ] ;
  10. int lmin[maxn << ],rmin[maxn << ] ;
  11. int sum[maxn << ] ;
  12.  
  13. void dp(int v)
  14. {
  15. int l = v << ,r = l+;
  16. sum[v] = sum[l]+sum[r] ;
  17. maxx[v] = max(max(maxx[l],maxx[r]),lmax[r] + rmax[l]) ;
  18. minn[v] = min(min(minn[l],minn[r]),lmin[r] + rmin[l]) ;
  19. lmax[v] = max(lmax[l],sum[l]+lmax[r]) ;
  20. rmax[v] = max(rmax[r],sum[r]+rmax[l]) ;
  21. lmin[v] = min(lmin[l],sum[l]+lmin[r]) ;
  22. rmin[v] = min(rmin[r],sum[r]+rmin[l]) ;
  23. }
  24. void build(int v,int l,int r)
  25. {
  26. if(l == r)
  27. {
  28. scanf("%d",&sum[v]) ;
  29. maxx[v] = minn[v] = lmax[v] = rmax[v] = lmin[v] = rmin[v] = sum[v] ;
  30. return ;
  31. }
  32. int mid = (l+r) >> ;
  33. build(v*,l,mid) ;
  34. build(v*+,mid+,r) ;
  35. dp(v) ;
  36. }
  37. void update(int v,int l,int r,int num,int value)
  38. {
  39. if(l == r)
  40. {
  41. sum[v] = maxx[v] = minn[v] = value ;
  42. lmax[v] = rmax[v] = lmin[v] = rmin[v] = value ;
  43. return ;
  44. }
  45. int mid = (l+r) >> ;
  46. if(mid >= num) update(v*,l,mid,num,value) ;
  47. else update(v*+,mid+,r,num,value) ;
  48. dp(v) ;
  49. }
  50.  
  51. int main()
  52. {
  53. int n ;
  54. while(~scanf("%d",&n))
  55. {
  56. build(,,n) ;
  57. int m ;
  58. scanf("%d",&m) ;
  59. while(m--)
  60. {
  61. int x,y ;
  62. int ans ;
  63. scanf("%d %d",&x,&y) ;
  64. update(,,n,x,y) ;
  65. if(sum[] == maxx[])
  66. ans = sum[]-minn[] ;
  67. else
  68. ans = max(maxx[], sum[]-minn[]) ;
  69. printf("%d\n",ans) ;
  70. }
  71. }
  72. return ;
  73. }

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. Android源码解析--Quick Search in Settings

    欢迎大家加入群里交流:429664282 基于:android-6.0.1_r17 f4b8ad6 Android Settings中存在一个SearchIndexablesProvider,它提供了 ...

  2. maven项目在tomcat中运行遇到的问题

    在使用maven构建项目,并在tomcat容器中运行的时候遇到了一些问题,现做一下记录 maven项目中jdk版本会自动恢复 maven项目的编译jdk即使在window -> java -&g ...

  3. xml_02

    1.xml 2.对于XML文档的约束   |-DTD      <!DOCTYPE 根元素 [       <!ELEMENT 元素名 (xx)>       <!ATTLIS ...

  4. 通过定时监听input框来实现onkeyup事件-

    问题:因为zepto无法使用onkeyup 事件 解决方法:通过给input框绑定focus 事件,定时的去监听input的值得改变,在鼠标移出input后,清除定时器 <!DOCTYPE ht ...

  5. LSJ_NHibernate第一章 NHibernate介绍

    前言: 说起NHibernate网上资料真不少,但用的人却并不多,说起java的SSH框架大家可能就知道了,这里的H指的就是Hibernate,一款好用的ORM框架,在.net重写了这款好用的框架,名 ...

  6. 20160418javaweb之 Filter过滤器

    Servlet规范中 Servlet Listener Filter 1.开发Filter 想要开发一个过滤器需要如下两个步骤: (1)写一个类实现特定的接口Filter 生命周期:当服务器启动时,w ...

  7. 自动生成get,set方法

    引发的问题: Action中有一个属性名字叫private boolean isHideNumber 用struts2的<s:if test ="isHideNumber"& ...

  8. cocoa pods

    # cocoa pods * `CocoaPods` 是 iOS 最常用最有名的类库管理工具 * 作为 iOS 程序员,掌握 `CocoaPods` 的使用是必不可少的基本技能 ## pod 命令汇总 ...

  9. OC与Swift的区别二(常量、变量、运算符)

    4.常量与变量声明 oc的变量声明使用  类型 变量名 = 变量值的方式,其中类型为系统内置数据类型或自定义类型,变量名需由英文字母开头且不能包含特殊字符 swift变量声明使用 var 变量名 = ...

  10. java新手笔记6 示例for

    1.计算天数 /*给定一个年月日,计算是一年的第几天 (如输入:2 15 结果:第46天) */ public class Demo1 { public static void main(String ...