ARC096D Static Sushi 记录前缀最大值

传送门ARC096D

思路:枚举 + 记录前缀最大值

我们考虑先逆时针走。

枚举逆时针的步数i,那么我们先从0->n+1-i,然后回到起点n+1-i->0

然后顺时针走,加上前缀最大值preMax[n-i]就好了。

先顺时针走同理。

code

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100000+10;
const LL INF = 1e16;

int n;
LL c, x[N], v[N];
LL w[N], preMax[N];

LL solve() {
    preMax[0] = -INF;
    for(int i=1;i<=n;i++) {
        w[i]=v[i]-(x[i]-x[i-1]);
        w[i]=w[i-1]+w[i];
        preMax[i]=max(preMax[i-1],w[i]);
    }
    LL ret = -INF;
    ret = preMax[n];

    LL sum = 0;
    for(int i=n;i>=1;i--) {
        sum += v[i];
        ret=max(ret, sum-2*(c-x[i])+preMax[i-1]);
    }
    return ret;
}
int main() {
    scanf("%d %lld",&n,&c);
    for(int i=1;i<=n;i++)
        scanf("%lld %lld", &x[i], &v[i]);
    LL ans = max(solve(),0LL);

    for(int i=1;i<=n;i++)
        if(i<n+1-i) {
            swap(x[i],x[n+1-i]);
            swap(v[i],v[n+1-i]);
        }
    for(int i=1;i<=n;i++)
        x[i]=c-x[i];
    ans = max(ans,solve());
    cout<<ans<<endl;
}

原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9017452.html

时间: 2024-08-04 23:47:36

ARC096D Static Sushi 记录前缀最大值的相关文章

从《楼房重建》出发浅谈一类使用线段树维护前缀最大值的算法

首先需要申明的是,真的是浅谈,因为我对这个算法的认识还是非常低的. 既然是从<楼房重建>出发,那么当然是先看看这道题: [清华集训2013]楼房重建 bzoj 链接 题意简述: 有 \(n\) 栋楼,第 \(i\) 栋的高度为 \(H_i\),也就是说第 \(i\) 栋楼可以抽象成一条两端点为 \((i, 0)\) 和 \((i, H_i)\) 的线段. 初始时 \(H_i\) 均为 \(0\),要支持动态修改单点的 \(H_i\). 每次询问从 \(O(0, 0)\) 点可以看到多少栋楼房.

[国家集训队]middle

Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数. 其中a<b<c<d.位置也从0开始标号.我会使用一些方式强制你在线. Input 第一行序列长度n.接下来n行按顺序给出a中的数. 接下来一行Q.然后Q行每行a,b,c,d,我们令上个询问的答案是x(如果这是第一个询问则x=0). 令数组

SPOJ 1825

我的树分治#3. After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, Travel Agent SPOJ goes on with another discount tour. The tour will be held on ICPC island, a miraculous one on the Pacific Ocean. We list N

csp-s模拟99

考前10天了... 昨天晚上真的不清醒,什么也码不对,心态爆炸. T1调了一个多小时没出来,T2因为少了一出q.pop()没A掉,T3随便写了几个sort竟然A了.十分懵逼. 最后20分钟想调T1,结果也没打完. T1: 每次的修改是独立的,求修改后的上升序列长度(最靠前上升序列). 预处理$f[i]$表示从开头到$i$的上升序列长度,就是截至$i$的答案.$g[i]$表示从$i$开始至结尾的答案.$f[i]$直接递推,顺便记录前缀最大值$ma[i]$.$g[i]$可以用单调栈处理. 每次修改对

如何取分组最大值记录

如何取分组最大值记录 分组最大值记录 比如    序号          名称       数量              1              A        20       2              A        10       1              B        20       2              B        40       3              B        10       1              C       

传智博客(JavaWeb方面的所有知识)听课记录(经典)

一.       JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本兼容低版本的编译器版本. (2).当程序有错误的时候,使用Debug as 运行程序.双击语句设置断点.程序运行到此处停止.点击跳入方法的内部代码.点击跳过,执行下一条代码,点击跳出,跳出方法.观察变量的值,选中变量右击 选择watch. 跳入下一个断点.查看断点,调试完后一定要清除断点.结束运行断

51nod 1277 KMP 前缀出现次数

51NOD 1277:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277 跟HDU 6153还挺像的:http://www.cnblogs.com/Egoist-/p/7435573.html 相比与上面那个题,这个还要相对简单一些,只需要处理模式串自己就好了. 一开始写麻烦了,直接套了HDU6153的代码,后来发现--他就是个模式串本身的匹配,我干嘛弄那么麻烦Orz 题意:找前缀长度*出现次数的最大值,长度好说,

子数组之和最大值

问题描述 给定一个序列\(A_0\).\(A_1\).\(A_2\).....\(A_{n-1}\),求\(A_i+A_{i+1}+...+A_j\)的最大值. 解一 暴力枚举左端点\(i\)和右端点\(j\),之后计算\(A_i\)和\(A_j\)之间的和,时间复杂度\(O(n^3)\),很容易TLE. #define INF 0x7FFFFFFF int sub_sum(int a[],int n) { int MAX = -INF; for(int i = 0;i < n;i++) { f

[C#6] 1-using static成员

1. 老版本写法 1 using System; 2 3 namespace csharp6 4 { 5 internal class Program 6 { 7 private static void Main(string[] args) 8 { 9 Console.WriteLine("blackheart"); 10 } 11 } 12 } 上面这段代码大家再熟悉不过了,使用静态类Console的静态方法WriteLine输出一行字符串.插播点关于CLR的相关知识,CLR在执行