首页 > 其他分享 >CF1796D 做题笔记

CF1796D 做题笔记

时间:2023-10-11 19:44:59浏览次数:42  
标签:lmx int max sum 笔记 mx CF1796D rmx

题目链接

一眼题,但这个 $k$ 迷惑了我很久。

由于我初始的思路没考虑 $x<0$,所以我们先默认 $x>0$。

考虑任意一个是最优答案的最大子段和,如果它的长度 $<k$ 那么它的每个元素一定都加上了 $x$,如果它的长度 $>k$,那么它的 $k$ 个元素一定加上了 $x$,剩余的一定减去了 $x$。

小于 $k$ 怎么搞都行,而如果长度大于 $k$,我们可以把 $k$ 个加 $x$ 的移到这个子段的最前面加这样显然不会有影响。

然后枚举这个答案的左端点之后,将左端点右边 $k$ 个都加上 $x$,剩余的都减去 $x$。

该过程可以用线段树维护,时间复杂度为 $O(n\log n)$,但是样例最后一个没过,还以为假了。随便猜了个 $x \to -x$ ,$k\to n-k$ 便过了样例然后一遍过了。

代码:

#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, k, x, ans = 0;
int c[200005];
struct S {int lmx, rmx, sum, mx;}a[800005];
void merge (S &a, S b, S c) {
    a.lmx = max (b.lmx, b.sum + c.lmx);
    a.rmx = max (c.rmx, c.sum + b.rmx);
    a.mx = max (max (b.mx, c.mx), b.rmx + c.lmx);
    a.sum = b.sum + c.sum;
}
void build (int l, int r, int k) {
    if (l == r) {
        a[k].lmx = a[k].rmx = a[k].sum = a[k].mx = c[l];
        return;
    }
    int mid = l + r >> 1;
    build (l, mid, k << 1);
    build (mid + 1, r, k << 1 | 1);
    merge (a[k], a[k << 1], a[k << 1 | 1]);
}
void update (int l, int r, int k, int x, int y) {
    if (l == r) {
        a[k].lmx += y;
        a[k].rmx += y;
        a[k].sum += y;
        a[k].mx += y;
        return;
    }
    int mid = l + r >> 1;
    if (x <= mid) update (l, mid, k << 1, x, y);
    else update (mid + 1, r, k << 1 | 1, x, y);
    merge (a[k], a[k << 1], a[k << 1 | 1]);
}
void solve () {
    cin >> n >> k >> x;
    if (x < 0) {
        x = -x;
        k = n - k;
    }
    ans = 0;
    For (i, 1, n) {
        cin >> c[i];
        if (i <= k) c[i] += x;
        else c[i] -= x;
    }
    build (1, n, 1);
    For (i, 1, n - k + 1) {
        if (i - 1) {
            update (1, n, 1, i - 1, -2 * x);
            update (1, n, 1, i + k - 1, 2 * x);
        }
        ans = max (ans, a[1].mx);
    }
    cout << ans << '\n';
}
signed main () {
    int _ = 1;
    cin >> _;
    while (_ --) {
        solve ();
        cout << '\n';
    }
    return 0;
}

 

标签:lmx,int,max,sum,笔记,mx,CF1796D,rmx
From: https://www.cnblogs.com/Xy-top/p/17758002.html

相关文章

  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(2)任务管理
    3.任务管理如何为每个任务分配处理时间,如何选择在任何给定时间执行何种任务,任务优先级,任务状态。3.2任务功能每个任务必须返回void,并接受一个void类型指针。这些任务一般会写成一个无限循环,由内核来调度,完成任务安排,创建和删除。3.3顶层任务状态由于一般单片机处理器为单核......
  • 2023_10_11_MYSQL_DAY_03_笔记_下
    2023_10_11_MYSQL_DAY_03_笔记_下#截断表的作用是把原来的表摧毁,重新创建一个结构和原来一模一样的新表,语法如下:TRUNCATETABLEtable;#TRUNCATE和DELETE区别#1、TRUNCATE是DDL命令,使用ROLLBACK不可以回滚。而DELETE是DML命令,使用ROLLBACK可以回滚。#2、DELETE可以通过指定......
  • 莫比乌斯函数及反演学习笔记
    前置知识\(1.\)艾佛森括号:\([P]=\begin{cases}1&\mathtt{(if\P\is\true)}\\0&\mathtt{(otherwise)}\end{cases}\)\(2.\)\(a\midb\)表示\(a\)是\(b\)的因子\(3.\)整除分块:\(\displaystyle\sum_{i=1}^n\lfloor\dfrac{N}{i}\rfloor\......
  • 2023年10月11日阅读笔记
    《深入理解计算机系统》这不仅是一本介绍计算机系统的教材,更是一本引领读者探索未知世界,理解计算机本质的指南。在阅读这本书的过程中,我深感计算机系统的复杂性和奇妙性,同时也领悟到技术背后的哲学思想。首先,这本书让我明白了计算机系统的各个层次和组件是如何协同工作的。从程......
  • 019 数据库学习笔记--代码生成工具(满满的成产力)
    -------------------------------生成实体类-------------------------------declare@TableNamesysname='ViewQualityInfo'declare@TableNameLsysname='viewQualityInfo'declare@Resultvarchar(max)='///<summary>///'......
  • 图论——树上问题 学习笔记
    图论——树上问题学习笔记目录树的直径树的重心树的中心经典问题1:最小化最大距离树的直径定义树上任意两节点之间最长的简单路径即为树的直径。显然,一棵树可以有多条直径,他们的长度相等。性质若树上所有边边权均为正,则树的所有直径有交,且中点重合;有树的直径\((p,q......
  • C#学习笔记--复杂数据类型、函数和结构体
    C#基础复杂数据类型特点:多个数据变量地一个集合体,可以自己命名种类:枚举、数组和结构体枚举:整型常量的集合数组:任意变量类型的顺序存储的数据集合结构体:任意变量类型的数据组合成的数据块枚举:枚举可以方便表示对象的各种状态,本质还是一种变量。例如我们可以用枚举来表示......
  • 博客笔记要求
    笔记风格的三条建议:结构清晰、细化(看着舒服便于查找)typota风格设置,善用引用、序号、点(看着美观)多放图片,大小合适和大小一致(看着美观)笔记内容的三条建议:保证内容正确性,多测试(集百家之言并有自己理解)(1)看懂(2)善用比喻能讲懂(3)总结经验尽量用自己的代码做测试(便于理解和......
  • 仅作笔记用:C语言 将结构体以二进制形式写入文件
    直接以文本文件的方式写入固然也可以,但是如果遇到数据量大的情况,会占用比较多的磁盘空间。这里收集汇总了一下将结构体数据写入二进制文件以及后续读取为结构体的办法。写入二进制文件的话,成员变量就可以直接以例如int、float、double这样的形式存储到磁盘,而不是转换成字符串,这......
  • 2023_10_11_MYSQL_DAY_03_笔记_上
    2023_10_11_MYSQL_DAY_03_笔记_上10章作业题01答案INSERTINTOclass(classid,cname)VALUES(1,'Java1班');INSERTINTOclass(cname,classid)VALUES('Java2班',2);INSERTINTOclassVALUES(3,'Java3班',NULL);10章作业题020304答案INSERTINTOstud......