题目链接

虽然是看的别的人思路,但是做出来还是挺高兴的。

首先求环上最大字段和,而且不能是含有全部元素。本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄。实际可以求出最小值,总和-最小,就可以求出,断开的情况了。

然后线段树要单点更新,这种标记,以前遇到过,不过一直没有写过,注意总和好更新,整个这一段的结果也很好更新,最难想的就是左边 和右边标记的结果,具体看pushup代码。

 #include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define maxn 100100
struct node
{
int sum,lmax,lmin,rmin,rmax;
int smax,smin;
}p[*maxn];
void pushup(int rt)
{
p[rt].sum = p[rt<<].sum + p[rt<<|].sum;
p[rt].smax = max(max(p[rt<<].smax,p[rt<<|].smax),p[rt<<].rmax+p[rt<<|].lmax);
p[rt].lmax = max(p[rt<<].lmax,p[rt<<].sum+p[rt<<|].lmax);
p[rt].rmax = max(p[rt<<|].rmax,p[rt<<|].sum+p[rt<<].rmax);
p[rt].smin = min(min(p[rt<<].smin,p[rt<<|].smin),p[rt<<].rmin + p[rt<<|].lmin);
p[rt].lmin = min(p[rt<<].lmin,p[rt<<].sum+p[rt<<|].lmin);
p[rt].rmin = min(p[rt<<|].rmin,p[rt<<|].sum+p[rt<<].rmin);
}
void build(int l,int r,int rt)
{
int m;
if(l == r)
{
scanf("%d",&p[rt].sum);
p[rt].lmax = p[rt].sum;
p[rt].rmax = p[rt].sum;
p[rt].smax = p[rt].sum;
p[rt].lmin = p[rt].sum;
p[rt].rmin = p[rt].sum;
p[rt].smin = p[rt].sum;
return ;
}
m = (l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushup(rt);
}
void update(int x,int sc,int l,int r,int rt)
{
int m;
if(l == x&&r == x)
{
p[rt].sum = sc;
p[rt].lmax = p[rt].sum;
p[rt].rmax = p[rt].sum;
p[rt].smax = p[rt].sum;
p[rt].lmin = p[rt].sum;
p[rt].rmin = p[rt].sum;
p[rt].smin = p[rt].sum;
return ;
}
m = (l+r)>>;
if(x <= m)
update(x,sc,l,m,rt<<);
if(x > m)
update(x,sc,m+,r,rt<<|);
pushup(rt);
}
int main()
{
int n,m,i,a,b;
while(scanf("%d",&n)!=EOF)
{
build(,n,);
scanf("%d",&m);
for(i = ;i <= m;i ++)
{
scanf("%d%d",&a,&b);
update(a,b,,n,);
if(p[].sum == p[].smax)//如果总和和最大值相同,断开一个最小值。
{
printf("%d\n",p[].sum - p[].smin);
}
else
{
printf("%d\n",max(p[].smax,p[].sum-p[].smin));
}
}
}
return ;
}

最新文章

  1. C# 动态调用DLL库
  2. \boot 空间不足解决方法
  3. 【SpringMVC】SpringMVC系列10之视图与视图解析器
  4. spring data jpa 创建方法名进行简单查询
  5. PHP生成随机字符串包括大小写字母
  6. Linux的SOCKET编程详解
  7. 20160509-hibernate--继承映射
  8. Android - 分享内容 - 接收其他APP的内容
  9. Centos7.2 编译安装PHP7
  10. java 学习笔记 读取配置文件的三种方式
  11. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.
  12. dnc开源梦之队2018 开源项目精选集
  13. 在深谈TCP/IP三步握手&amp;四步挥手原理及衍生问题—长文解剖IP
  14. Partition(hdu4651)2013 Multi-University Training Contest 5
  15. PIGS POJ - 1149(水最大流)
  16. DAO层设计
  17. [20170623]利用传输表空间恢复数据库2.txt
  18. C# DataReader
  19. MySQL5.7.11免安装版的安装和配置:解决MYSQL 服务无法启动问题
  20. DataFrame数据批量做线性回归

热门文章

  1. Codeforces Round #305 (Div. 2) D. Mike and Feet
  2. haskell 乱搞(2)之 Y-conbinator [原创]
  3. spring之lazy-init
  4. poj3180 The Cow Prom
  5. 【leetcode 字符串】466. Count The Repetitions
  6. uva 11178二维几何(点与直线、点积叉积)
  7. FGrowth算法
  8. hdu 1717
  9. BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]
  10. 2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683