bzoj1756 Vijos1083 小白逛公园
Description
Input
Output
Sample Input
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
Sample Output
-1
有一点坑的线段树……你需要特殊的写代码技巧
每个线段树节点要保存几个数据:lm从左节点往右能取到的最大值,rm从右节点往左能取到的最大值。ans保存当前区间任取一段的最大值
因为是单点更新,所以连lazy tag也不需要,精华在于询问和标记上传的函数
上传标记的时候要更新好多东西:
区间和tot:最简单,左边加右边
lm:可以取左边的一整段加右边的lm,或者只取左边的lm。lm=max(左边的tot+右边的lm,左边的lm)
rm:可以取右边的一整段加左边的rm,或者只取右边的rm。rm=max(右边的tot+左边的rm,右边的rm)
ans:可以取更新完的当前的lm、rm,或者取左边的rm加右边的lm
然后询问的时候函数的返回值要是一个线段树的节点而不只是一个数据答案
因为从左右转移的时候,你不知道这个答案是从左边的rm还是ans转移而来,右边也是
具体来说,如果左边从rm转移而来,那么它可以和右边的lm合并,而ans不能保证会“紧贴“在区间的右边,就不能和右边的lm合并
所以要返回一个线段树的节点,然后一切都简单了
#include<cstdio>
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void swap(int &a,int &b){int t=a;a=b;b=t;}
inline int max(int a,int b){if (a>b)return a;else return b;}
struct trees{int l,r,ls,rs,lm,rm,ans,tot;}tree[2000001];
int n,m,a[500001],treesize;
inline void update(int k)
{
int ll=tree[k].ls,rr=tree[k].rs;
tree[k].tot=tree[ll].tot+tree[rr].tot;
tree[k].lm=max(tree[ll].lm,tree[ll].tot+tree[rr].lm);
tree[k].rm=max(tree[rr].rm,tree[rr].tot+tree[ll].rm);
tree[k].ans=max(max(tree[ll].ans,tree[rr].ans),tree[ll].rm+tree[rr].lm);
}
inline void buildtree(int l,int r)
{
if (l>r) return;
int now=++treesize;
tree[now].l=l;tree[now].r=r;
if (l==r)
{
tree[now].tot=tree[now].lm=tree[now].rm=tree[now].ans=a[l];
return;
}
int mid=(l+r)>>1;
tree[now].ls=treesize+1;
buildtree(l,mid);
tree[now].rs=treesize+1;
buildtree(mid+1,r);
update(now);
}
inline trees ask(int k,int l,int r)
{
int x=tree[k].l,y=tree[k].r;
if (l==x&&r==y) return tree[k];
int mid=(x+y)>>1,ll=tree[k].ls,rr=tree[k].rs;
if(r<=mid) return ask(ll,l,r);
else if (l>mid) return ask(rr,l,r);
else
{
trees t_ans;
trees t1=ask(ll,l,mid);
trees t2=ask(rr,mid+1,r);
t_ans.ans=max(max(t1.ans,t2.ans),t1.rm+t2.lm);
t_ans.rm=max(tree[rr].rm,tree[rr].tot+t1.rm);
t_ans.lm=max(tree[ll].lm,tree[ll].tot+t2.lm);
return t_ans;
}
}
inline void change(int k,int to,int dat)
{
int x=tree[k].l,y=tree[k].r;
if (x==y)
{
tree[k].tot=tree[k].lm=tree[k].rm=tree[k].ans=dat;
return;
}
int mid=(x+y)>>1;
if (to<=mid)change(tree[k].ls,to,dat);
if (to>mid)change(tree[k].rs,to,dat);
update(k);
}
int main()
{
n=read();m=read();
for (int i=1;i<=n;i++)
a[i]=read();
buildtree(1,n);
for (int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
if (x==1)
{
if (y>z) swap(y,z);
printf("%d\n",ask(1,y,z).ans);
}else change(1,y,z);
}
return 0;
}
bzoj1756 Vijos1083 小白逛公园的更多相关文章
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 【线段树】bzoj1756 Vijos1083 小白逛公园
我们知道,求一段序列的最大子段和是O(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 ...
- 【Vijos1083/BZOJ1756】小白逛公园(线段树)
[写在前面]TYC (Little White) 真是太巨啦! 题目: Vijos1083 分析: 一眼看上去就是线段树啊-- 然而当我这种蒟蒻兴高采烈地把线段树模板敲了一半,却发现一个问题: 这子区 ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- vijos1083:小白逛公园
小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
随机推荐
- StackPanel 弹出菜单 ContextMenu
<StackPanel x:Name="stackpanel_zonghe" Margin="0,10,0,0" Background="Tra ...
- HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
题意:给定三个串,问c串是否能由a,b串任意组合在一起组成,但注意a,b串任意组合需要保证a,b原串的顺序 例如ab,cd可组成acbd,但不能组成adcb. 分析:对字符串上的dp还是不敏感啊,虽然 ...
- mac os使用lsusb命令和连接未知的Android设备
今天在mac上连接一个android设备发现连不上,adb devices看不到设备.于是想用lsusb命令看下,结果发现Mac居然没有这个命令,于是网上搜了下.发现了以下的命令system_prof ...
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
- 【SSH三框架】Struts2第六章的基础:他们拦截函数的定义
干web当然,需要做的事情时,项目管理登录身份验证及其他权利.假设我们必须使用相应的登陆,未经允许是不可能的. 因此,我们需要使用拦截器,拦截功能struts2它集成.当然,有可能在Spring正在使 ...
- AsyncHttpClient httpURLCon httpClient AsyncTask 访问服务器
Activity /** * 测试使用三种方式(AsyncHttpClient.httpURLCon.httpClient)分别以get和post方式访问服务器 * @author 白乾涛 */ ...
- DataGrid( 数据表格) 组件[2]
本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...
- Log4net日志组件使用
一.简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日 ...
- GDI相关基础知识
原文链接:http://blog.csdn.net/poem_qianmo/article/details/7333886 GDI(Graphics Device Interface) 图形设备接口, ...
- 轻松完成WAP手机网站搭建
用PHPCMS最新发布的V9搭建了PHPCMS研究中心网站(http://phpcms.org.cn)完成后,有用户提出手机访问的问题,于是着手搭建WAP无线站(wap.phpcms.org.cn). ...