BZOJ2388 : 旅行规划
考虑分块,每块维护两个标记$ts,td$。
那么对于块中一个位置$i$,它的实际值为$i\times td+ts+v_i$。
修改的时候,对于整块,直接打标记,对于零散的暴力修改,然后重构凸壳,时间复杂度$O(\sqrt{n})$。
查询的时候在凸壳上二分即可,时间复杂度$O(\sqrt{n}\log n)$。
#include<cstdio>
#define N 100010
typedef long long ll;
int n,m,cnt,lim,i,op,x,y,pos[N],st[N],en[N],R[N],q[N];ll v[N],ts[N],td[N];
inline int read(){
char c;bool f=0;int a=0;
while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));
if(c!='-')a=c-'0';else f=1;
while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
if(f)a=-a;
return a;
}
inline double cross(int x,int y){return(double)(v[x]-v[y])/(double)(y-x);}
inline void build(int x){
int i,L=st[x],t=L;
q[t]=t;
for(i=t+1;i<=en[x];q[++t]=i++)while(t>L&&cross(i,q[t])<=cross(q[t],q[t-1]))t--;
R[x]=t;
}
inline void change(int x,int y,ll s,ll d){
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++)v[i]+=s+d*i;
build(pos[x]);
return;
}
for(int i=pos[x]+1;i<pos[y];i++)ts[i]+=s,td[i]+=d;
for(int i=en[pos[x]];i>=x;i--)v[i]+=s+d*i;
build(pos[x]);
for(int i=st[pos[y]];i<=y;i++)v[i]+=s+d*i;
build(pos[y]);
}
inline void modify(int x,int y,ll z){
change(x,y,z*(1-x),z);
if(y<n)change(y+1,n,z*(y-x+1),0);
}
inline void up(ll&a,ll b){if(a<b)a=b;}
inline ll ask(int x){
int t=st[x],l=t+1,r=R[x],mid;
while(l<=r){
mid=(l+r)>>1;
if(cross(q[mid-1],q[mid])<td[x])l=(t=mid)+1;else r=mid-1;
}
return td[x]*q[t]+ts[x]+v[q[t]];
}
inline ll query(int x,int y){
ll t=-(1LL<<62);
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);
return t;
}
for(int i=pos[x]+1;i<pos[y];i++)up(t,ask(i));
for(int i=en[pos[x]];i>=x;i--)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);
for(int i=st[pos[y]];i<=y;i++)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);
return t;
}
int main(){
n=read();
for(i=1;i<=n;i++)v[i]=v[i-1]+read();
while(lim*lim*8<n)lim++;
for(i=1;i<=n;i++)pos[i]=(i-1)/lim+1;
cnt=pos[n];
for(i=1;i<=n;i++)en[pos[i]]=i;
for(i=n;i;i--)st[pos[i]]=i;
for(i=1;i<=cnt;i++)build(i);
m=read();
while(m--){
op=read(),x=read(),y=read();
if(!op)modify(x,y,read());else printf("%lld\n",query(x,y));
}
return 0;
}
BZOJ2388 : 旅行规划的更多相关文章
- BZOJ2388:旅行规划(travel)——分块凸包
题目 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 $n$ 个最著名的经典连接起来,让游客可以通过火车从铁路 ...
- 2019.01.20 bzoj2388: 旅行规划(分块+凸包)
传送门 分块好题. 题意:维护区间加,维护区间前缀和的最大值(前缀和指从1开始的). 思路: 考虑分块维护答案. 我们把每个点看成(i,sumi)(i,sum_i)(i,sumi)答案一定会在凸包上 ...
- BZOJ2388: 旅行规划(分块 凸包)
题意 题目链接 Sol 直接挂队爷的题解了 分块题好难调啊qwq #include<bits/stdc++.h> #define LL long long using namespace ...
- 「BZOJ2388」旅行规划
传送门 分块+凸包 求出前缀和数组s 对于l~r加上k,相当于s[l]~s[r]加上一个首项为k,公差为k的等差数列.r~n加上k*(r-l+1). 分块之后对每一块维护两个标记,一个记录它加的等差数 ...
- 旅行规划(travel)
题目描述 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 nnn 个最著名的经典连接起来,让游客可以通过火车从 ...
- BZOJ 2388: 旅行规划 [分块 凸包 等差数列]
传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...
- VIJOS1476 旅行规划(树形Dp + DFS暴力乱搞)
题意: 给出一个树,树上每一条边的边权为 1,求树上所有最长链的点集并. 细节: 可能存在多条最长链!最长链!最长链!重要的事情说三遍 分析: 方法round 1:暴力乱搞Q A Q,边权为正-> ...
- @bzoj - 2388@ 旅行规划
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...
- BZOJ 2388--旅行规划(分块&单调栈&二分)
2388: 旅行规划 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 405 Solved: 118[Submit][Status][Discuss] ...
随机推荐
- UITableview reloadData Animation 动画效果
http://blog.kingiol.com/blog/2013/10/22/uitableview-reloaddata-with-animation/ 运用到UITableview进行重新加载数 ...
- different between unicorn / unicorn_rails
$ unicorn_rails -h Usage: unicorn_rails [ruby options] [unicorn_rails options] [rackup config file] ...
- GLUT教程 - 安装
转载:http://www.cnblogs.com/live41/p/3368830.html glut库 - 下载频道 - CSDN.NEThttp://download.csdn.net/down ...
- DCMTK3.6.0(MD支持库)安装说明
一.运行环境:WIN7 32bit + VisualStudio2008 + dcmtk3.6.0 + Cmake2.8.8 或者 WIN7 64bit 二.准备工作: 1)MD/MT的知识储备: / ...
- 最短路&&最小生成树水题
训练赛20151122 5:00:00 Overview Problem Status Rank Discuss Current Time: 2015-11-23 17:33:18 Conte ...
- 《ASP.NET MVC4 WEB编程》学习笔记------.net mvc实现原理ActionResult/View
ActionResult ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回 ...
- 《ASP.NET1200例》嵌套在DataLisT控件中的其他服务器控件---DropDownList控件的数据绑定
aspx <script type="text/javascript"> function CheckAll(Obj) { var AllObj = document. ...
- cocos2dx混合模式应用
//Opacity 0完全透明 255完全不透明 //ALPHA 0完全透明 1完全不透明 CCRenderTexture* pRT = CCRenderTexture::create(480,320 ...
- iOS 中contraints居中对齐的一点心得
今天遇到一个布局问题,先看图 如何让第二个控件在第一个和第三个的竖直上的中间呢?contraint不能直接实现这样的效果.我们可以再添加一个控件,如图 这样之后,再把第二个控件和这个新添加的控件设置为 ...
- Java for LeetCode 045 Jump Game II
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...