传送门

  • 题目:
  • 思路:
    • 式子:
      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∑i​earn[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(单调栈/单调栈+线段树最大子段和)相关推荐

  1. 完美字符子串 单调队列预处理+DP线段树优化

    题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...

  2. POJ2823 Sliding Window【单调队列】【线段树】【ST表】

    Sliding Window POJ - 2823 题意: 给出一个长度为N的序列,通过一个窗口,可以看到序列中连续的K个元素,窗口从最左边出发,每次移动一个单位,对于每次移动,输出当前窗口中的最大值 ...

  3. COCI 2015/2016 PROKLETNIK(单调栈+线段树)

    COCI 2015/2016 PROKLETNIK 题目大意 给定序列A1..NA_{1..N}A1..N​,分别求出QQQ组询问区间[L,R][L,R][L,R]中最长的连续子序列Al..rA_{l ...

  4. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  5. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  6. POJ - 3250 Bad Hair Day(单调队列/单调栈)

    题目链接:点击查看 题目大意:给出n只牛,高度参差不齐,所有的牛都朝向右边,他们可以看到右边所有没有遮挡并且比自己低的牛,问每只牛可以看到的牛的数量总和是多少 题目分析:这个题目让求每只牛看到的牛的数 ...

  7. 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 ...

  8. [LOJ3153] 三级跳(单调栈 + 线段树)

    problem loj3153 solution 有一个显然正确但又不起眼却是正解必备的结论: 考虑 (x,y,z)(x,y,z)(x,y,z) 答案三元对,如果有一个数 i∈(x,y)∧ai≥axi ...

  9. [HNOIAHOI2018] 转盘(线段树维护单调栈)

    problem 洛谷链接 solution 结论:最优方案中一定有一种是全程不停的. 断环成链,接一个 [1,n][1,n][1,n] 在后面形成 2n2n2n 的序列,同时将时间戳逆过来. 转化成: ...

  10. [CF 526 F] Pudding Monsters(单调栈 + 线段树)

    CF526F Pudding Monsters problem solution code problem luogu翻译 solution observation :每行每列恰好有一个棋子,所以如果 ...

最新文章

  1. Mastering Caching in Asp.net
  2. 字符输入流_Reader类FileReader类介绍
  3. STM32H743+CubeMX-计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)
  4. 笨办法学 Python · 续 练习 19:改善性能
  5. 【语音去噪】基于matlab基本维纳滤波算法语音去噪【含Matlab源码 570期】
  6. 价值连城 神经网络- 吴恩达Andrew Ng Coursera Neural Networks and Deep Learning
  7. 手把手教你安装微信开发者工具
  8. Visio 2003 Professional
  9. CnCerT.Net.SKiller工作原理
  10. qq离线文件服务器是怎么实现秒传,一招教你提高QQ文件传输速度的方法
  11. php实现图片加密,PHP实现支持加盐的图片加密解密.pdf
  12. 如何从固态硬盘启动计算机,怎么把固态硬盘设置为第一启动系统
  13. MYSQL 如何实现重复读
  14. NOIP模拟测试19
  15. luoguP3799 妖梦拼木棒
  16. Java对二维数组进行排序
  17. 【数据结构与算法】BF算法(详解)
  18. 西电软工计算机通信与网络期末复习要点总结
  19. Linux权限位中的s、t
  20. Android WindowManagerService机制分析:窗口的显示层级

热门文章

  1. 线性支持向量分类机及其实现
  2. 备份outlook的时候,请不要忘记同时备份Outlook.NK2文件
  3. Linux文件系统的创建与管理(上)
  4. SVN,HG,GIT 命令说明
  5. linux中搜索指定字符串的方法
  6. unity资源面数规范
  7. 测试用例文档_如何设计测试用例
  8. CSS 自定义滚动条样式
  9. MySQL提取字符串中数字(自定义函数)
  10. 【转】js中forEach回调同异步问题