题目链接

  1. /*
  2. 13904K 532ms
  3. 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5
  4. 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最小连续子段和
  5. 二是两个端点不都取,如a1,a2,a3,那需要记录最大连续子段和
  6. 线段树,令maxs[l,r]为[l,r]上最大连续子段和,mins[l,r]同理
  7. 在向上更新时,可能是由整个左右节点拼成,也可能是只由左或右更新,也可能两段都有,但不包括最左/右端点
  8. 所以还需要记录包括区间左端点的maxsl,minsl,包括区间右端点的maxsr,minsr
  9. 那PushUp的转移就很好写了。见PushUp
  10. 是要求最大真子段和,不能包括所有点,要特判!
  11. */
  12. #include<cstdio>
  13. #include<cctype>
  14. #include<algorithm>
  15. //#define gc() getchar()
  16. #define gc() (SS==TT &&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  17. #define lson node[rt].ls
  18. #define rson node[rt].rs
  19. const int N=2e5+5,MAXIN=5e6;
  20. int n;
  21. char IN[MAXIN],*SS=IN,*TT=IN;
  22. inline int read()
  23. {
  24. int now=0,f=1;register char c=gc();
  25. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  26. for(;isdigit(c);now=now*10+c-'0',c=gc());
  27. return now*f;
  28. }
  29. struct Seg_Tree
  30. {
  31. int tot;
  32. struct Node
  33. {
  34. int l,r,ls,rs,sum,maxs,mins,maxsl,maxsr,minsl,minsr;
  35. void Set(int v)
  36. {
  37. sum=maxs=mins=maxsl=maxsr=minsl=minsr=v;
  38. }
  39. }node[N<<1];
  40. inline void PushUp(int rt)
  41. {
  42. node[rt].sum=node[lson].sum+node[rson].sum;
  43. node[rt].maxs=std::max(std::max(node[lson].maxs,node[rson].maxs),node[lson].maxsr+node[rson].maxsl);
  44. node[rt].mins=std::min(std::min(node[lson].mins,node[rson].mins),node[lson].minsr+node[rson].minsl);
  45. node[rt].maxsl=std::max(node[lson].maxsl,node[lson].sum+node[rson].maxsl);
  46. node[rt].minsl=std::min(node[lson].minsl,node[lson].sum+node[rson].minsl);
  47. node[rt].maxsr=std::max(node[rson].maxsr,node[rson].sum+node[lson].maxsr);
  48. node[rt].minsr=std::min(node[rson].minsr,node[rson].sum+node[lson].minsr);
  49. }
  50. void Build(int l,int r)
  51. {
  52. int p=tot++;
  53. node[p].l=l, node[p].r=r;
  54. if(l==r)
  55. {
  56. node[p].ls=node[p].rs=-1;
  57. node[p].Set(read());
  58. // node[p].sum=node[p].maxs=node[p].mins=node[p].maxsl=node[p].minsl=node[p].maxsr=node[p].minsr=read();
  59. return;
  60. }
  61. int m=l+r>>1;
  62. node[p].ls=tot, Build(l,m);
  63. node[p].rs=tot, Build(m+1,r);
  64. PushUp(p);
  65. }
  66. void Modify(int rt,int pos,int v)
  67. {
  68. if(node[rt].l==node[rt].r){node[rt].Set(v); return;}
  69. int m=node[rt].l+node[rt].r>>1;
  70. if(pos<=m) Modify(lson,pos,v);
  71. else Modify(rson,pos,v);
  72. PushUp(rt);
  73. }
  74. // int Query_Max(int rt,int L,int R)
  75. // {
  76. // if(L<=node[rt].l && node[rt].r<=R) return node[rt].maxs;
  77. // int m=node[rt].l+node[rt].r>>1;
  78. // if(L<=m)
  79. // if(m<R) return std::max(Query_Max(lson,L,R),Query_Max(rson,L,R));
  80. // else Query_Max(lson,L,R);
  81. // return Query_Max(rson,L,R);
  82. // }
  83. // int Query_Min(int rt,int L,int R)
  84. // {
  85. // if(L<=node[rt].l && node[rt].r<=R) return node[rt].mins;
  86. // int m=node[rt].l+node[rt].r>>1;
  87. // if(L<=m)
  88. // if(m<R) return std::min(Query_Min(lson,L,R),Query_Min(rson,L,R));
  89. // else Query_Min(lson,L,R);
  90. // return Query_Min(rson,L,R);
  91. // }
  92. }t;
  93. int main()
  94. {
  95. #ifndef ONLINE_JUDGE
  96. freopen("2750.in","r",stdin);
  97. #endif
  98. n=read();
  99. t.Build(1,n);
  100. int m=read(),p,v;
  101. while(m--)
  102. p=read(),v=read(),t.Modify(0,p,v),
  103. printf("%d\n",t.node[0].sum==t.node[0].maxs? t.node[0].sum-t.node[0].mins : std::max(t.node[0].maxs,t.node[0].sum-t.node[0].mins));//全是正数则要减去一个最小值
  104. // printf("%d\n",std::max(t.Query_Max(0,1,n),t.node[0].sum-t.Query_Min(0,1,n)));
  105. // printf("Max:%d Min:%d sum:%d\n",t.Query_Max(0,1,n),t.Query_Min(0,1,n),t.node[0].sum);
  106. return 0;
  107. }

POJ.2750.Potted Flower(线段树 最大环状子段和)的更多相关文章

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

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

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

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

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

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

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

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

  5. POJ 2750 Potted Flower

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

  6. POJ 2750 Potted Flower (单点改动求线段树上最大子序列和)

    题目大意: 在一个序列上每次改动一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每一个区间的最大值就好了. 可是此处成环,那么看一下以下例子. 5 1 -2 ...

  7. Potted Flower(线段树+dp)

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

  8. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  9. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

随机推荐

  1. 【转】mysql8.0 在window环境下的部署与配置

    [转]mysql8.0 在window环境下的部署与配置 今天在阿里云window服务器上配置mysql环境,踩了一些坑,分享出来.需要的朋友可以看看.额,或许有人要吐槽我为什么不在linux上去配置 ...

  2. py-faster-rcnn + opencv3.0.0 + ubuntu16.04配置(CPU模式)

    最近开始做行人检测,因此开始接触faster-rcnn,这里贴上配置教程(亲测可行),不过是基于cpu的,蓝瘦... 参考博客:http://www.tuicool.com/articles/nYJr ...

  3. freeRTOS中文实用教程3--中断管理之计数信号量

    1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...

  4. freeRTOS中文实用教程3--中断管理之延迟中断处理

    1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只 ...

  5. SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具

    http://scons.org/ https://www.ibm.com/developerworks/cn/linux/l-cn-scons/index.html 后附:另外,WAF是一个基于sc ...

  6. WDS 三种模式

    (1)懒人模式(Lazy mode) 此模式下不需要填写对端的BSSID,本端AP的WDS连接作为被动连接,只需要对端填写了本端AP的BSSID即可,效果和桥接模式一样. (2)桥接模式(Bridge ...

  7. Linux常用命令2(远程文件下载+查看文件内容)

    一.远程文件下载的两种方法:ftp命令 + scp命令 ftp命令: 服务器若安装了ftp Server,另外一台Linux可以使用ftp的client程序来进行文件的远程拷贝读取下载和写入上载. 1 ...

  8. 蝉知CMS本地迁移到服务器具体步骤

    蝉知迁移步骤(2个方案,二选一即可) 方案一(整个chanzhi(eps)目录拷贝,假设新安装的蝉知文件夹名称为chanzhieps): 1.在新服务器上安装相同版本(版本号必须一致)的蝉知(安装文档 ...

  9. cf796d 树,bfs好题!

    绝对是好题,把所有警察局放入队列然后开始广搜,如果碰到了vis过的顶点,但是那条边没有访问过,那么这条边就可以删掉 另外广搜的vis标记是在入队时就打的,, #include<bits/stdc ...

  10. CF 449D 题解(状压+容斥)

    状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]. ...