题意

题目链接

Sol

直接挂队爷的题解了

分块题好难调啊qwq

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e6 + 10;
const LL INF = 6e18;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, block, bel[MAXN], bl[MAXN], br[MAXN], mx;
vector<int> con[MAXN];
LL bg[MAXN], d[MAXN], a[MAXN];
double slope(int x, int y) {
return double (a[y] - a[x]) / (y - x);
}
void rebuild(int id) {
vector<int> &v = con[id]; v.clear();
for(int i = bl[id]; i <= br[id]; i++) {
while(v.size() > 1 && (slope(v[v.size() - 2], i) >= (slope(v[v.size() - 2], v[v.size() - 1])))) v.pop_back();
v.push_back(i);
}
}
LL Find(vector<int> &v, double k, int lef) {
int l = 0, r = v.size() - 1, ans = 0;
while(l <= r) {
int mid = l + r >> 1;
if(mid == 0 || (slope(v[mid - 1], v[mid]) > k)) ans = mid, l = mid + 1;
else r = mid - 1;
}
return a[v[ans]] + 1ll * (v[ans] - lef + 1) * (-k);
}
void Modify(int l, int r, int val) {
for(int i = l; i <= min(r, br[bel[l]]); i++) a[i] += 1ll * val * (i - l + 1);
rebuild(bel[l]);
if(bel[l] != bel[r]) {
for(int i = bl[bel[r]]; i <= r; i++) a[i] += 1ll * val * (i - l + 1);
}
for(int i = r + 1; i <= br[bel[r]]; i++) a[i] += 1ll * val * (r - l + 1);
rebuild(bel[r]);
for(int i = bel[l] + 1; i <= bel[r] - 1; i++) {
bg[i] += 1ll * (bl[i] - l + 1) * val - val;
d[i] += val;
}
for(int i = bel[r] + 1; i <= mx; i++) bg[i] += 1ll * val * (r - l + 1);
}
LL Query(int l, int r) {
LL ans = -INF;
for(int i = l; i <= min(r, br[bel[l]]); i++)
chmax(ans, bg[bel[l]] + 1ll * (i - bl[bel[l]] + 1) * d[bel[l]] + a[i]);
if(bel[l] != bel[r]) {
for(int i = bl[bel[r]]; i <= r; i++)
chmax(ans, bg[bel[r]] + 1ll * (i - bl[bel[r]] + 1) * d[bel[r]] + a[i]);
}
for(int i = bel[l] + 1; i <= bel[r] - 1; i++) {
chmax(ans, bg[i] + Find(con[i], -d[i], bl[i]));
}
return ans;
}
signed main() {
N = read(); block = sqrt(N);
for(int i = 1; i <= N; i++) a[i] = read() + a[i - 1], bel[i] = (i - 1) / block + 1, chmax(mx, bel[i]);
// for(int i = 1; i <= 16; i++) cout << a[i] << " ";
for(int i = 1; i <= mx; i++) bl[i] = (i - 1) * block + 1, br[i] = bl[i] + block - 1, rebuild(i);
M = read();
for(int i = 1; i <= M; i++) {
int opt = read();
if(opt == 0) {
int l = read(), r = read(), v = read();
Modify(l, r, v);
} else {
int l = read(), r = read();
cout << Query(l, r) << '\n';
}
}
return 0;
}
/*
16
51 -6867 25916 -19111 -23413 -282 7274 6888 15114 6563 18264 -11811 27336 14638 19495 -10931
1
1 9 16 */

BZOJ2388: 旅行规划(分块 凸包)的更多相关文章

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

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

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

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

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

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

  4. BZOJ2388 : 旅行规划

    考虑分块,每块维护两个标记$ts,td$. 那么对于块中一个位置$i$,它的实际值为$i\times td+ts+v_i$. 修改的时候,对于整块,直接打标记,对于零散的暴力修改,然后重构凸壳,时间复 ...

  5. 「BZOJ2388」旅行规划

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

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

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

  7. 旅行规划(travel)

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

  8. bzoj2388(分块 凸包)

    好像没有什么高级数据结构能够很高效地实现这个东西: 那就上万能的分块,我们用一些数形结合的思想,把下标看成横坐标,前缀和的值看成纵坐标: 给区间内每个数都加k相当于相邻两点的斜率都加上k: 这种东西我 ...

  9. @bzoj - 2388@ 旅行规划

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

随机推荐

  1. Linux巩固记录(5) hadoop 2.7.4下自己编译代码并运行MapReduce程序

    程序代码为 ~\hadoop-2.7.4\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.7.4-sources\org\apac ...

  2. 【hyperscan】示例解读 pcapscan

    示例位置: <hyperscan source>/examples/pcapscan.cc参考:http://01org.github.io/hyperscan/dev-reference ...

  3. 将python打包为.exe文件

    第一步:在https://pypi.python.org/pypi/PyInstaller/2.1 下载pyinstaller. 第二步:解压缩,在该目录下命令行中执行python setup.py ...

  4. elasticsearch+logstash+redis+kibana 实时分析nginx日志

    1. 部署环境 2. 架构拓扑 3. nginx安装 安装在192.168.176.128服务器上 这里安装就简单粗暴了直接yum安装nginx [root@manager ~]# yum -y in ...

  5. 【spring揭秘】1、关于IOC的基础概念

    1.基础概念 IOC有三种注入方式: 1.构造方法注入,就是通过构造方法进行实例化成员属性对象,优点是实现对象之后直接就可以使用,但是参数过多也是个麻烦 2.setter方法注入,实现相应的sette ...

  6. WebForm——JS检测浏览器是否是IE浏览器

    function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 && userAgen ...

  7. JAVA多态计算面积main函数调用方法

    public static void main(String[] args) { Shape shape; Scanner input = new Scanner(System.in); System ...

  8. Android_view的生命周期

    onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure( int , int ) 确定所有子元素的大小 onLayout( boolean , int ...

  9. linux下实现进度条小程序

    转载自:实现一个简单的进度条 我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在linux下实现这个进度条的功能. 1.我们使用的关键打印语句是printf函数: printf(&quo ...

  10. Linux编辑启动停止重启springboot jar包脚本

    springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.activ ...