考虑分块,每块维护两个标记$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 : 旅行规划的更多相关文章

  1. BZOJ2388:旅行规划(travel)——分块凸包

    题目 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 $n$ 个最著名的经典连接起来,让游客可以通过火车从铁路 ...

  2. 2019.01.20 bzoj2388: 旅行规划(分块+凸包)

    传送门 分块好题. 题意:维护区间加,维护区间前缀和的最大值(前缀和指从1开始的). 思路: 考虑分块维护答案. 我们把每个点看成(i,sumi)(i,sum_i)(i,sumi​)答案一定会在凸包上 ...

  3. BZOJ2388: 旅行规划(分块 凸包)

    题意 题目链接 Sol 直接挂队爷的题解了 分块题好难调啊qwq #include<bits/stdc++.h> #define LL long long using namespace ...

  4. 「BZOJ2388」旅行规划

    传送门 分块+凸包 求出前缀和数组s 对于l~r加上k,相当于s[l]~s[r]加上一个首项为k,公差为k的等差数列.r~n加上k*(r-l+1). 分块之后对每一块维护两个标记,一个记录它加的等差数 ...

  5. 旅行规划(travel)

    题目描述 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 nnn 个最著名的经典连接起来,让游客可以通过火车从 ...

  6. BZOJ 2388: 旅行规划 [分块 凸包 等差数列]

    传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...

  7. VIJOS1476 旅行规划(树形Dp + DFS暴力乱搞)

    题意: 给出一个树,树上每一条边的边权为 1,求树上所有最长链的点集并. 细节: 可能存在多条最长链!最长链!最长链!重要的事情说三遍 分析: 方法round 1:暴力乱搞Q A Q,边权为正-> ...

  8. @bzoj - 2388@ 旅行规划

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...

  9. BZOJ 2388--旅行规划(分块&单调栈&二分)

    2388: 旅行规划 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 118[Submit][Status][Discuss] ...

随机推荐

  1. python学习之操作mysql

    欢迎点击个人博客 http://www.iwangzheng.com/ 刚开始学python,所以很多代码都需要在ipython里尝试一下.今天记录的是最基本的操作mysql数据库. 写数据库连接操作 ...

  2. Can't connect to local MySQL Server throught socket '/var/run/mysqld/mysqld.sock'(2)

    www.iwangzheng.com 由于之前调整了/etc/mysql/my.cnf试图修复数据库不能存中文的问题,这个问题没解决,以至于数据库连接不上了. tail -f /var/log/mys ...

  3. Linux文件权限管理(持续更新)

    文章是从我的个人博客上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 以root身份登录linux以后, ls -al 可以看到 -rw-rw-r--  1 wangzhe ...

  4. HDU3344(小广搜+小暴力

    Kakuro Extension Extension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. grep与egrep

    当只有一个匹配条件时:egrep pattern file等价于grep -E pattern file 例如: 当多个匹配条件时,只能用egrep -e pattern1 -e pattern2 - ...

  6. shell脚本检测局域网内存活主机

    <1> d211 admin # for i in {3..254} ; do ping -c 1 192.168.1.$i &>/dev/null && e ...

  7. 【转】java反射详解

    转自:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的 ...

  8. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  9. Java for LeetCode 179 Largest Number

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  10. codeforces A. Vasily the Bear and Triangle 解题报告

    题目链接:http://codeforces.com/problemset/problem/336/A 好简单的一条数学题,是8月9日的.比赛中没有做出来,今天看,从pupil变成Newbie了,那个 ...