传送门

题意:

区间加和询问一段区间内整体前缀和的最大值


刚才还在想做完这道题做一道区间加等差数列结果发现这道就是....

唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!!

线段树没法搞吧....分块!

每个块维护整体加标记,首项,公差

修改的时候:

左面不完整的块下放标记暴力重构;

中间的整块打标记;

右面不完整的块也是下放标记暴力重构,注意这个地方$r$之外的部分也要更新!

右面完整的块也要打标记!

怎么查询呢?

左右不完整的块暴力查询

中间的整块,可以发现我们每次修改的只有公差会造成影响,类似于斜率,凸包的形状不会改变(斜率的相对大小不会改变),所以维护一个凸包,查询时三分就行了

其实我现在还不会三分就去黄学长哪里抄了一个奇怪的东西

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e5+,M=;
const ll INF=1e18;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,op,x,y; ll a[N];
struct _blo{int l,r;}b[M];
int block,m,pos[N];
inline void ini(){
block=sqrt(n); m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+ , b[i].r=i*block;
b[m].r=n;
} struct ConvexHull{
int a[M],n;
int& operator [](int x){return a[x];}
}con[M];
int st[N]; struct Block{
inline double slope(int i,int j){return (double)(a[i]-a[j])/(i-j);}
void Set(int x){
int top=;
for(int i=b[x].l ; i<=b[x].r ; i++){
while(top> && slope(i,st[top-])>=slope(st[top],st[top-]) ) top--;
st[++top]=i;
}
for(int i=;i<=top;i++) con[x][i]=st[i];
con[x].n=top; con[x][]=con[x][top+]=;
} ll f[M],d[M],add[M];
void pushDown(int x){
ll now=f[x];
for(int i=b[x].l ; i<=b[x].r ; i++) a[i]+=now+add[x],now+=d[x];
f[x]=d[x]=add[x]=;
} void Add(int l,int r,ll v){
int pl=pos[l],pr=pos[r];
ll now=;
if(pl==pr){
pushDown(pl);
for(int i=l;i<=r;i++) now+=v,a[i]+=now;
for(int i=r+ ; i<=b[pr].r ; i++) a[i]+=now;
Set(pl); for(int i=pr+;i<=m;i++) add[i]+=now;
}else{
pushDown(pl);
for(int i=l ; i<=b[pl].r ; i++) now+=v,a[i]+=now;
Set(pl); for(int i=pl+;i<pr;i++) now+=v,f[i]+=now,d[i]+=v,now+=v*(block-); pushDown(pr);
for(int i=b[pr].l ; i<=r ; i++) now+=v,a[i]+=now;
for(int i=r+ ; i<=b[pr].r ;i++) a[i]+=now;
Set(pr); for(int i=pr+;i<=m;i++) add[i]+=now;
}
} inline ll cal(int x){
if(x==) return -INF;//!!!!!
int t=pos[x];
return a[x]+add[t] + f[t]+d[t]*(x-b[t].l) ;
}
ll Bin(int x){
int l=,r=con[x].n;
while(l<=r){
int mid=(l+r)>>;
ll a=cal(con[x][mid-]),b=cal(con[x][mid]),c=cal(con[x][mid+]);
if(a<b&&b<c) l=mid+;
else if(a>b&&b>c) r=mid-;
else return b;
}
return ;
}
ll Que(int l,int r){
int pl=pos[l],pr=pos[r];
ll re=-INF;
if(pl==pr)
for(int i=l;i<=r;i++) re=max(re,cal(i));
else{
for(int i=l ; i<=b[pl].r ; i++) re=max(re,cal(i));
for(int i=b[pr].l ; i<=r ; i++) re=max(re,cal(i));
for(int i=pl+;i<pr;i++) re=max(re,Bin(i));
}
return re;
}
}B; int main(){
freopen("in","r",stdin);
n=read(); ini();
for(int i=;i<=n;i++) a[i]=read()+a[i-];
for(int i=;i<=m;i++) B.Set(i);
Q=read();
while(Q--){
op=read();x=read();y=read();
if(op==) B.Add(x,y,read());
else printf("%lld\n",B.Que(x,y));
}
}

BZOJ 2388: 旅行规划 [分块 凸包 等差数列]的更多相关文章

  1. @bzoj - 2388@ 旅行规划

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

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

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

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

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

  4. 「BZOJ2388」旅行规划

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

  5. 旅行规划(travel)

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

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

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

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

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

  8. bzoj 4501: 旅行 01分数规划+概率期望dp

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4501 题解: 首先我们不考虑可以删除边的情况下,如何计算期望边数. 然后我们发现这是个有 ...

  9. BZOJ.4942.[NOI2017]整数(分块)

    BZOJ 洛谷 UOJ 可能是退役之前最后一个BZOJ rank1了? 参考这里. 如果没有减法,对一个二进制数暴力进位,均摊复杂度是\(O(1)\)的(要进\(O(n)\)次位就至少需要\(O(n) ...

随机推荐

  1. 面试(2)-java-se-HashSet和TreeSet12

    Set是java中一个不包含重复元素的collection.更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素.正如其名称所暗示的, ...

  2. [国嵌攻略][161][USB总线介绍]

    USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...

  3. [国嵌笔记][012][GCC程序编译]

    GCC特点 GCC(GUN C Compiler)是GUN推出的功能强大.性能优越的多平台编译器.其执行效率与一般编译器相比平均效率要高20%~30%. GCC基本用法 gcc [options] f ...

  4. Oracle_SQL92_连接查询

    Oracle_SQL92_连接查询   笛卡儿积 --笛卡尔积 select * from emp;----14 select * from dept;----4 select * from emp, ...

  5. 【搬运】Tea算法Java实现工具类

    最近在做数据加密,目标是实现平台app的数据安全性,所以准备使用AES+Base64进行加密,适逢一个特长的json串AES加密不了,于是在谷歌了各种算法,判断是否合用,参见 各种加密算法比较 一文中 ...

  6. css中,如何设置前景色的透明度?

    谢谢 我等待的他 | 浏览 255446 次 推荐于2016-01-13 12:27:03 最佳答案 css控制透明度倒不麻烦. filter:alpha(opacity=50); -moz-opac ...

  7. ADO.NET复习总结(6)-断开式数据操作

    一.基础知识 主要类及成员(和数据库无关的)(1)类DataSet:数据集,对应着库,属性Tables表示所有的表(2)类DataTable:数据表,对应着表,属性Rows表示所有的行(3)类Data ...

  8. 【编程技巧】NSDate,NSDateFormatter,NSTimeInterval

    //获取日期 todaysDate=[NSDate date]; //显示日期和时间 dateFormat = [[NSDateFormatter alloc] init];//NSDate没有自己的 ...

  9. Servlet基础(工作原理、生命周期)

    (一)Servlet开发与配置 1.1 开发步骤 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行! 配置信息: ...

  10. CCF系列之数字排序(201503-2)

    问题描述试题编号: 201503-2试题名称: 数字排序时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输 ...