BZOJ 1756: Vijos1083 小白逛公园
题目
1756: Vijos1083 小白逛公园
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 856 Solved: 264
[Submit][Status]
Description
Input
Output
Sample Input
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
Sample Output
-1
题解
这道题是线段树,我们可以维护一个区间的Ans->必须取一个点的最大和,LAns->必须取左端点的最大和,RAns->必须去右端点的最大和,还有Sum->区间和。这样两个区间就可以轻松的合并成一个大区间了,脑补一下做法~好吧,这道题貌似查询的时候区间的左右端点顺序可能是反的QAQ注意一下。
代码
/*Author:WNJXYK*/
#include<cstdio>
using namespace std; inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
inline int remax(int a,int b){
if (a>b) return a;
return b;
} const int Maxn=;
struct Btree{
int left,right;
int sum;
int lans,rans,ans;
};
Btree tree[Maxn*+];
int num[Maxn+]; void build(int x,int left,int right){
tree[x].left=left;
tree[x].right=right;
if (left==right){
tree[x].rans=tree[x].lans=tree[x].ans=num[left];
tree[x].sum=num[left];
}else{
int mid=(left+right)/;
build(x*,left,mid);
build(x*+,mid+,right);
tree[x].sum=tree[x*].sum+tree[x*+].sum;
tree[x].ans=remax(tree[x*].rans+tree[x*+].lans,remax(tree[x*].ans,tree[x*+].ans));
tree[x].lans=remax(tree[x*].lans,tree[x*].sum+tree[x*+].lans);
tree[x].rans=remax(tree[x*+].rans,tree[x*].rans+tree[x*+].sum);
}
} void change(int x,int loc,int val){
if (tree[x].left==tree[x].right && tree[x].left==loc){
tree[x].sum=val;
tree[x].rans=tree[x].lans=tree[x].ans=val;
}else{
int mid=(tree[x].left+tree[x].right)/;
if (loc<=mid){
change(x*,loc,val);
}else{
change(x*+,loc,val);
}
tree[x].sum=tree[x*].sum+tree[x*+].sum;
tree[x].ans=remax(tree[x*].rans+tree[x*+].lans,remax(tree[x*].ans,tree[x*+].ans));
tree[x].lans=remax(tree[x*].lans,tree[x*].sum+tree[x*+].lans);
tree[x].rans=remax(tree[x*+].rans,tree[x*].rans+tree[x*+].sum);
}
} Btree _queryAns(int x,int left,int right){
if (left<=tree[x].left && tree[x].right<=right){
return tree[x];
}else{
int mid=(tree[x].left+tree[x].right)/;
if (left>mid){
return _queryAns(x*+,left,right);
}else if (right<mid+){
return _queryAns(x*,left,right);
}else{
Btree _Ans;
Btree tmp1,tmp2;
tmp1=_queryAns(x*,left,right);
tmp2=_queryAns(x*+,left,right);
_Ans.sum=tmp1.sum+tmp2.sum;
_Ans.ans=remax(tmp1.rans+tmp2.lans,remax(tmp1.ans,tmp2.ans));
_Ans.lans=remax(tmp1.lans,tmp1.sum+tmp2.lans);
_Ans.rans=remax(tmp2.rans,tmp1.rans+tmp2.sum);
return _Ans;
}
}
} int n,m;
int k,a,b;
int main(){
//freopen("b.in","r",stdin);
//freopen("b.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)scanf("%d",&num[i]);
build(,,n);
for (;m--;){
scanf("%d%d%d",&k,&a,&b);
if (k==){
if (a>b) swap(a,b);
printf("%d\n",_queryAns(,a,b).ans);
}else{
change(,a,b);
}
}
return ;
}
BZOJ 1756: Vijos1083 小白逛公园的更多相关文章
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- bzoj1756 Vijos1083 小白逛公园
Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. ...
- 【线段树】bzoj1756 Vijos1083 小白逛公园
我们知道,求一段序列的最大子段和是O(n)的,但是这样是显然会超时的. 我们需要一个数据结构来支持修改和计算的操作,对于这种修改一个而查询区间的问题,考虑使用线段树. 在线段树中,除了左端点,右端点, ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- vijos1083:小白逛公园
小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
随机推荐
- IOS开发之----协议与委托(Protocol and Delegate) 实例解析
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 在写示例之前我给大家说下@required和@optional这两个关键 ...
- objective-C学习笔记(十一)类别和扩展
类别 类别是对外的,外部都可以访问 类别是在没有源代码或者基于某些特定场合的情况下,为一个类增加功能(方法).或者用于给一个特别大的类进行分割. 命名规则:类名+扩展方法,如NSString 可以添加 ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...
- 微信 php 获取ticket
<?phpheader('content-type:text/html; charset=utf8');define('TOKEN', 'youtoken'); // TOKENdefine(' ...
- 利用python进行数据分析之绘图和可视化
matplotlib API入门 使用matplotlib的办法最常用的方式是pylab的ipython,pylab模式还会向ipython引入一大堆模块和函数提供一种更接近与matlab的界面,ma ...
- 电子标签(RFID)天线的印制技术
电子标签是射频识别(RFID)的俗称,RFID是射频识别技术的英文(RadioFrequencyIdentification)缩写,射频识别技术是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无 ...
- python2.6升级到2.7
开发部需要使用python2.7,由于公网的环境python版本都是系统自带的,版本是2.6,需要升级,最好是通过RPM升级. Linux系统:CentOS CentOS 6.4升级Python后yu ...
- [转载]cin、cin.get()、cin.getline()、getline()、gets()函数的用法
1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream>using namespace std;main ( ...
- 数学之路-python计算实战(16)-机器视觉-滤波去噪(邻域平均法滤波)
# -*- coding: utf-8 -*- #code:myhaspl@myhaspl.com #邻域平均法滤波,半径为2 import cv2 import numpy as np fn=&qu ...
- 数据科学家:神话 & 超能力持有者
一个打破神话的季节,正在降临. 我将坦诚地揭穿人们关于数据科学家所持有的惯有看法.在下文中,我将一个一个展示这些观点,宛如将一个又一个的玻璃瓶子摔碎在墙壁上一样. 关于数据 ...