考虑分块,每块维护两个标记$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. puppet 安装

    yum源配置 1. wget http://ftp.kaist.ac.kr/fedora//epel/6/i386/epel-release-6-8.noarch.rpm 2. yum list | ...

  2. 【Markdown】notepad++ 支持 markdown语法、预览

    Notepad++中支持Markdown   最近在学习Markdown语言的使用,很想在XP主机上使用Markdown的离线编辑器,但MarkdownPad.作业部分的离线客户端都不能再XP上运行, ...

  3. 关于Linux下进程间使用共享内存和信号量通信的时的编译问题

    今天在编译一个使用信号量实现进程同步时,出现了库函数不存在的问题.如下图 编译结果实际上是说,没include相应的头文件,或是头文件不存在(即系统不支持该库函数) 但我man shm_open是可以 ...

  4. Java for LeetCode 154 Find Minimum in Rotated Sorted Array II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  5. Java for LeetCode 028 Implement strStr()

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. elk+redis分布式分析nginx日志

    一.elk套件介绍 ELK 由 ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.官方网站: https://www.elastic.co/products El ...

  7. Greedy:Fence Repair(POJ 3252)

    Fence Repair 问题大意:农夫约翰为了修理栅栏,要将一块很长的木块切割成N块,准备切成的木板的长度为L1,L2...LN,未切割前的木板的长度恰好为切割后木板的长度的总和,每次切断木板的时候 ...

  8. HybridApp iOS ATS解决方案

    苹果在最近的一次WWDC上提出将在2017年1月1日起强制我们用HTTPS,否则提交App可能会被拒绝.很多ios应用的已经放出支持HTTPS的SDK了.本文主要针对混合式IOS应用提供相关的解决方案 ...

  9. [hihoCoder] 博弈游戏·Nim游戏

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在 ...

  10. mysql-关于Unix时间戳(unix_timestamp)

    unix_timestamp时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp). Unix时间戳(Unix t ...