【CF1107G】Vasya and Maximum Profit(单调栈/单调栈+线段树最大子段和)
传送门
- 题目:
- 思路:
- 式子:
earn[i]=a−c[i]earn[i]=a-c[i]earn[i]=a−c[i]sum[i]=∑j=1iearn[j],(1≤i≤n)sum[i]=\sum_{j=1}^{i}earn[j],(1≤i≤n)sum[i]=j=1∑iearn[j],(1≤i≤n)ans=max{sum[r]−sum[l−1]+gap(l,r)}ans=max\{sum[r]-sum[l-1]+gap(l,r)\}ans=max{sum[r]−sum[l−1]+gap(l,r)} - 纯单调栈:O(n)O(n)O(n)
从后往前枚举左端点:ans=max{sum[r]+gap(l,r)−sum[l−1]}ans=max\{sum[r]+gap(l,r)-sum[l-1]\}ans=max{sum[r]+gap(l,r)−sum[l−1]}左端点固定时,式子中的最后一项sum[l−1]sum[l-1]sum[l−1]是一定的,每当左端点向左移动一位时,g(l,r)g(l,r)g(l,r)可能会改变。
假定左端点向左移动一位时新增的差值为sd,sd=d[l+1]−d[l]sd,sd=d[l+1]-d[l]sd,sd=d[l+1]−d[l],考虑以sdsdsd为g(l,r)g(l,r)g(l,r)的右端点rrr,且在这些右端点中记录最大的max[r]max[r]max[r],记为valvalval,那么val−sd∗sd−earn[l]val-sd*sd-earn[l]val−sd∗sd−earn[l]就可能成为最大值,记为A。同时也要记录[l+1,r][l+1,r][l+1,r]内最大合法的的sum[r]+gap(l+1,r)sum[r]+gap(l+1,r)sum[r]+gap(l+1,r),记为B,并取max(A,B)−earn[l−1]max(A,B)-earn[l-1]max(A,B)−earn[l−1]更新答案。
因为是新值先处理的思路,所以用栈来做。注意l=rl=rl=r的情况,状态要从合法的情况转移过来。 - 单调栈+线段树最大子段和:O(nlogn)O(nlogn)O(nlogn)
观察式子ans=max{sum[r]−sum[l−1]+gap(l,r)}ans=max\{sum[r]-sum[l-1]+gap(l,r)\}ans=max{sum[r]−sum[l−1]+gap(l,r)},如果没有最后一项,前面可以通过线段树求[1,n][1,n][1,n]的最大子段和得到。有最后一项的话,枚举差值sdsdsd,通过单调栈预处理出以当前位置的sdsdsd为gap(l,r)gap(l,r)gap(l,r)的区间l,rl,rl,r,在l,rl,rl,r区间内查询最大子段和,不断更新答案,特殊处理下选择l=rl=rl=r这种情况。
大佬详解
- 式子:
- ac代码:
纯单调栈做法:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5+10;
int n;
ll a, c;
ll d[maxn], earn[maxn];
struct node{ll sub, val, mx_all;
}s[maxn];
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d %lld", &n, &a);for(int i = 1; i <= n; i++) scanf("%lld %lld", &d[i], &c), earn[i] = earn[i-1]+(a-c);int top = 0;ll ans = max(0ll, a-c);s[++top] = {0, earn[n], earn[n]};s[0].mx_all = LLONG_MIN;for(int i = n-1; i >= 1; i--){ll sd = d[i+1]-d[i], mx = LLONG_MIN;while(top>0 && s[top].sub<=sd) mx = max(mx, s[top--].val);top++; s[top] = {sd, mx, max(s[top-1].mx_all, mx-sd*sd)};top++; s[top] = {0, earn[i], max(s[top-1].mx_all, earn[i])};ans = max(ans, s[top].mx_all-earn[i-1]);}printf("%lld\n", ans);return 0;
}
【CF1107G】Vasya and Maximum Profit(单调栈/单调栈+线段树最大子段和)相关推荐
- 完美字符子串 单调队列预处理+DP线段树优化
题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...
- POJ2823 Sliding Window【单调队列】【线段树】【ST表】
Sliding Window POJ - 2823 题意: 给出一个长度为N的序列,通过一个窗口,可以看到序列中连续的K个元素,窗口从最左边出发,每次移动一个单位,对于每次移动,输出当前窗口中的最大值 ...
- COCI 2015/2016 PROKLETNIK(单调栈+线段树)
COCI 2015/2016 PROKLETNIK 题目大意 给定序列A1..NA_{1..N}A1..N,分别求出QQQ组询问区间[L,R][L,R][L,R]中最长的连续子序列Al..rA_{l ...
- 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]
题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...
- 2019南昌网络赛-I(单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...
- POJ - 3250 Bad Hair Day(单调队列/单调栈)
题目链接:点击查看 题目大意:给出n只牛,高度参差不齐,所有的牛都朝向右边,他们可以看到右边所有没有遮挡并且比自己低的牛,问每只牛可以看到的牛的数量总和是多少 题目分析:这个题目让求每只牛看到的牛的数 ...
- HDU - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?! 莫队/单调栈 + 线段树/ST表在线
传送门 文章目录 题意: 思路: 题意: 思路: 考虑将贡献分开来算,先计算最大值,再算个最小值,之后答案就是((max+min)/2)/(len∗(len+1)/2)((max+min)/2)/(l ...
- [LOJ3153] 三级跳(单调栈 + 线段树)
problem loj3153 solution 有一个显然正确但又不起眼却是正解必备的结论: 考虑 (x,y,z)(x,y,z)(x,y,z) 答案三元对,如果有一个数 i∈(x,y)∧ai≥axi ...
- [HNOIAHOI2018] 转盘(线段树维护单调栈)
problem 洛谷链接 solution 结论:最优方案中一定有一种是全程不停的. 断环成链,接一个 [1,n][1,n][1,n] 在后面形成 2n2n2n 的序列,同时将时间戳逆过来. 转化成: ...
- [CF 526 F] Pudding Monsters(单调栈 + 线段树)
CF526F Pudding Monsters problem solution code problem luogu翻译 solution observation :每行每列恰好有一个棋子,所以如果 ...
最新文章
- Mastering Caching in Asp.net
- 字符输入流_Reader类FileReader类介绍
- STM32H743+CubeMX-计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)
- 笨办法学 Python · 续 练习 19:改善性能
- 【语音去噪】基于matlab基本维纳滤波算法语音去噪【含Matlab源码 570期】
- 价值连城 神经网络- 吴恩达Andrew Ng Coursera Neural Networks and Deep Learning
- 手把手教你安装微信开发者工具
- Visio 2003 Professional
- CnCerT.Net.SKiller工作原理
- qq离线文件服务器是怎么实现秒传,一招教你提高QQ文件传输速度的方法
- php实现图片加密,PHP实现支持加盐的图片加密解密.pdf
- 如何从固态硬盘启动计算机,怎么把固态硬盘设置为第一启动系统
- MYSQL 如何实现重复读
- NOIP模拟测试19
- luoguP3799 妖梦拼木棒
- Java对二维数组进行排序
- 【数据结构与算法】BF算法(详解)
- 西电软工计算机通信与网络期末复习要点总结
- Linux权限位中的s、t
- Android WindowManagerService机制分析:窗口的显示层级