【vijos】P1083 小白逛公园
【算法】线段树
【题解】
学自:https://vijos.org/p/1083/solution(wang_yanheng的回答)
回溯时维护一段区间的以下域:
- sumL:从左端点起连续区间的最大和
- sumR:从右端点起连续区间的最大和
- sum:整段区间的和
- subSum:最大子区间和
以上域在叶子节点中的值,都等于节点代表公园的评分
设当前节点为 x,左孩子为 l,右孩子为 r。则:
x.sumL = MAX(l.sumL, l.sum + r.sumL);
x.sumR = MAX(r.sumR, r.sum + l.sumR);
x.sum = l.sum + r.sum;
x.subSum = MAX(l.subSum, r.subSum, l.sumR + r.sumL);
以上计算过程可以写成函数,参数结构体,返回结构体。
查询时要返回结构体。
#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f,maxn=;
struct cyc{int lsum,rsum,sum,subsum;}t[maxn*];
int a[maxn],L[maxn*],R[maxn*],n,m;
cyc calc(cyc a,cyc b)
{
cyc c;
c.lsum=max(a.lsum,a.sum+b.lsum);
c.rsum=max(b.rsum,b.sum+a.rsum);
c.sum=a.sum+b.sum;
c.subsum=max(a.subsum,max(b.subsum,a.rsum+b.lsum));
return c;
}
void build(int k,int l,int r)
{
L[k]=l;R[k]=r;
if(l==r)t[k]={a[l],a[l],a[l],a[l]};
else
{
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
t[k]=calc(t[k<<],t[k<<|]);
}
}
void update(int k,int x,int num)
{
int left=L[k],right=R[k];
if(left==right)t[k]={num,num,num,num};
else
{
int mid=(left+right)>>;
if(x<=mid)update(k<<,x,num);
else update(k<<|,x,num);
t[k]=calc(t[k<<],t[k<<|]);
}
}
cyc ask(int k,int l,int r)
{
int left=L[k],right=R[k];
if(l<=left&&right<=r)return t[k];
else
{
int mid=(left+right)>>;
if(l>mid)return ask(k<<|,l,r);
if(r<=mid)return ask(k<<,l,r);
return calc(ask(k<<,l,r),ask(k<<|,l,r));
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
build(,,n);
for(int i=;i<=m;i++)
{
int k,b,c;
scanf("%d%d%d",&k,&b,&c);
if(k==)
{
if(b>c)swap(b,c);
printf("%d\n",ask(,b,c).subsum);
}
else update(,b,c);
}
}
【vijos】P1083 小白逛公园的更多相关文章
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
- Vijos 1083 小白逛公园(线段树)
线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...
- [vijos]1083小白逛公园<线段树>
描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公 ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- vijos1083:小白逛公园
小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...
随机推荐
- iOS-tableView刷新指定行,组
/一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:]; [tableview reloadSections:inde ...
- PAT-2018年冬季考试-乙级
1091 N-自守数 代码: #include <bits/stdc++.h> using namespace std; int T; int A(int a) { ; while(a) ...
- activemq控制面板里的NumberOfPendingMessages、MessagesEnqueued、MessagesDequeued含义
Number Of Consumers 消费者 这个是消费者端的消费者数量.Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队列 ...
- 关于&$地址传递的练习
php默认为传值传递: 既: $a=10;$b=$a; //$b为10$a=+10; //$a 为20 echo $a.'和'.$b; # $a is 20 and $b is 10! 要是想变为地 ...
- WebKit 源码分析 -- loader
原文地址: http://peirenlei.iteye.com/blog/1718569 摘要:本文介绍 WebCore 中 Loader 模块是如何加载资源的,分主资源和派生资源分析 loader ...
- 能选择日期范围js控件
html页面中使用日期控件是常有的事,好控件能使用开发变的快捷,下面是在开发过程中发现的几款日期控件,比较不错,收藏 1.基于bootstrap的jQuery日期范围选择插件 2.jQuery多功能日 ...
- asp.net中缓存的使用
刚学到asp.net怎么缓存,这里推荐学习一下 www.cnblogs.com/wang726zq/archive/2012/09/06/cache.html http://blog.csdn.net ...
- 【Python】python基础_代码编写注意事项
1. 说明使用的编译方式 1 #!/usr/bin/python 2. 说明字符编码方式 1 #coding=utf-8 3. print 默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 # ...
- 一些技巧 && 常数优化 && 出现の错误
开坑原因 7.21 今天DTZ大爷教了我一个算欧拉函数的好方法......是质因数复杂度的 这让我想到,这些小技巧小idea,很多时候,可能就是考场上最致命.最一击必杀的"大招" ...
- Linux相关——关于gdb的checkpoint & breakpoints指令
1,checkpoint ,,,这个指令简直,,,相见恨晚啊,居然现在才发现,.. 好吧来介绍一下这个指令:checkpoint(检查点) 我们调试程序,常常会出现好不容易发现了错误,却已经跑完那个地 ...