BZOJ 2388: 旅行规划 [分块 凸包 等差数列]
题意:
区间加和询问一段区间内整体前缀和的最大值
刚才还在想做完这道题做一道区间加等差数列结果发现这道就是....
唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!!
线段树没法搞吧....分块!
每个块维护整体加标记,首项,公差
修改的时候:
左面不完整的块下放标记暴力重构;
中间的整块打标记;
右面不完整的块也是下放标记暴力重构,注意这个地方$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: 旅行规划 [分块 凸包 等差数列]的更多相关文章
- @bzoj - 2388@ 旅行规划
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...
- BZOJ2388: 旅行规划(分块 凸包)
题意 题目链接 Sol 直接挂队爷的题解了 分块题好难调啊qwq #include<bits/stdc++.h> #define LL long long using namespace ...
- BZOJ 2388--旅行规划(分块&单调栈&二分)
2388: 旅行规划 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 405 Solved: 118[Submit][Status][Discuss] ...
- 「BZOJ2388」旅行规划
传送门 分块+凸包 求出前缀和数组s 对于l~r加上k,相当于s[l]~s[r]加上一个首项为k,公差为k的等差数列.r~n加上k*(r-l+1). 分块之后对每一块维护两个标记,一个记录它加的等差数 ...
- 旅行规划(travel)
题目描述 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 nnn 个最著名的经典连接起来,让游客可以通过火车从 ...
- BZOJ2388:旅行规划(travel)——分块凸包
题目 OIVillage 是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl 决定修建了一条铁路将当地 $n$ 个最著名的经典连接起来,让游客可以通过火车从铁路 ...
- 2019.01.20 bzoj2388: 旅行规划(分块+凸包)
传送门 分块好题. 题意:维护区间加,维护区间前缀和的最大值(前缀和指从1开始的). 思路: 考虑分块维护答案. 我们把每个点看成(i,sumi)(i,sum_i)(i,sumi)答案一定会在凸包上 ...
- bzoj 4501: 旅行 01分数规划+概率期望dp
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4501 题解: 首先我们不考虑可以删除边的情况下,如何计算期望边数. 然后我们发现这是个有 ...
- BZOJ.4942.[NOI2017]整数(分块)
BZOJ 洛谷 UOJ 可能是退役之前最后一个BZOJ rank1了? 参考这里. 如果没有减法,对一个二进制数暴力进位,均摊复杂度是\(O(1)\)的(要进\(O(n)\)次位就至少需要\(O(n) ...
随机推荐
- [国嵌攻略][159][SPI子系统]
SPI 子系统架构 1.SPI core核心:用于连接SPI客户驱动和SPI主控制器驱动,并且提供了对应的注册和注销的接口. 2.SPI controller driver主控制器驱动:用来驱动SPI ...
- Linux中安装opencv-3.3.1
在ubuntu16.04中安装opencv3.3.1的过程中踩了许多坑.一开始直接安装还挺顺利但运行程序时总是提示libgtk2.0-dev和pkg-config没有安装,在安装这两个包的过程中也不顺 ...
- SMTP错误码建议解决方法
https://wenku.baidu.com/view/0af30e01e87101f69e3195b8.html SMTP 错误码 / 建议解决方法 错误总表 101 Cannot Open Co ...
- Redis 数据结构与内存管理策略(下)
Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...
- 01 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之业务分析与DAO层
作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 这是一个整合IDEA+Maven+SSM框架的高并发的商品秒杀项目.我们将分为以下几篇文章来进行详 ...
- Web API <五> 序列化
在 Asp.Net Web Api 中提供了两种 媒体类型格式化器(mime-type formatter),分别用于支持 JSON 和 XML 数据的格式化处理.默认两种格式化器已集成到了 Asp. ...
- Codeforces 448 D. Multiplication Table 二分
题目链接:D. Multiplication Table 题意: 给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m). 题解: n ...
- 【原创】ligerGrid使用初长成
第一步:下载ligerUI ,官网: http://www.ligerui.com/ 里边有详细的API.demo等信息,选择需要的版本下载. 第二步:解压缩,得到ligerUI文件夹,里边包含js ...
- 自定义jstl fn函数fns
1.引入函数声明: jsp页面需要引入自定义fns函数声明:<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld&q ...
- crontab执行带参数的php脚本,并取得参数[转]
现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多. 比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报 ...