题解:Luogu P5665 [CSP-S2019] 划分

news/2024/12/24 0:36:22/文章来源:https://www.cnblogs.com/P2441M/p/18625356

一些闲话

毒瘤题!!!时空都卡。难以想象 2019 年的考生作何感想。

简述题意

给定长度为 \(n\) 的序列 \(a\)。你需要找到一些分界点 \(1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n\),使得

\[\sum_{i=1}^{k_1} a_i \leq \sum_{i=k_1+1}^{k_2} a_i \leq \cdots \leq \sum_{i=k_p+1}^{n} a_i \]

在此基础上,最小化

\[\left(\sum_{i=1}^{k_1} a_i\right)^2 + \left(\sum_{i=k_1+1}^{k_2} a_i\right)^2 + \cdots + \left(\sum_{i=k_p+1}^{n} a_i\right)^2 \]

对于所有数据,\(2\leq n\leq 4\times 10^7\)\(1\leq a_i\leq 10^9\)

题解

算法 1

暴力 DP。令 \(f_{i,j}\) 表示考虑 \(a[1,i]\),且最后一段为 \(a[j+1,i]\) 的最小价值。转移时直接枚举倒数第二段的划分点并保证合法即可。时间复杂度 \(O(n^3)\)

算法 2

考虑贪心

我们有一个性质:在最优划分方案中,最后一段的元素和必然是所有合法划分方案中最小的。由各段元素和具有单调性,证明显然。

于是可以优化算法 1。这时候我们改变状态,令 \(f_i\) 表示考虑 \(a[1,i]\),且最后一段为 \([f_i+1,i]\)。再设 \(g_i=s_i-s_{f_i}\),即最优划分方案中最后一段的元素和。考察一个位置 \(j\) 能够作为决策点的条件:

\[g_j\leq s_i-s_j \]

所以我们在转移时,暴力枚举决策点,找到满足上述条件且最靠右的 \(j\)。时间复杂度 \(O(n^2)\)

正解

显然

\[g_j\leq s_i-s_j\Leftrightarrow g_j+s_j\leq s_i \]

所以对每个位置维护这个 \(val_j=g_j+s_j\),随便套个数据结构就能做到 \(O(n\log n)\),但依然会被卡掉。所以我们需要(均摊)\(O(1)\) 的转移。

考虑单调队列优化。对于两个合法决策点 \(i,j\),我们只需要保留较大的那一个,所以我们维护一个下标和对应的 \(val\)单调递增的单调队列。每次循环一个 \(i\),若 \(val_{q_{head+1}}\leq s_i\),就不断弹出队头。决策点就是最终合法的队头或 \(0\)。加入一个新的决策时,平凡地维护单调性即可。时间复杂度 \(O(n)\)

当然,这题十分毒瘤,空间和时间都卡得很死,需要拼命优化。空间优化上,不要开高精数组,一个多余的 \(O(n)\) 数组都不要开。时间优化上,快读肯定要上的,高精压位压到 \(8\) 位应该够用了。

代码

#include <iostream>
#include <iomanip>using namespace std;#define lowbit(x) ((x) & -(x))
#define add_mod(x, v) (x) = ((ll)(x) + (v)) % MOD
#define mul_mod(x, v) (x) = (1ll * (x) * (v)) % MOD
#define sub_mod(x, v) (x) = (((ll)(x) - (v)) % MOD + MOD) % MOD
#define chk_min(x, v) (x) = min((x), (v))
#define chk_max(x, v) (x) = max((x), (v))
typedef long long ll;
typedef pair<int, int> pii;
const int MAX_N = 4e7 + 5, MAX_BITS = 4 + 5, BIT = (1 << 30) - 1, C = 1e8;int n, tp;
ll f[MAX_N], a[MAX_N];
int l = 1, r = 0;
ll q[MAX_N];ll calc(int i) { return a[i] - a[f[i]] + a[i]; }ll read() {int s = 1; char ch;for (ch = getchar(); (ch < '0' || ch > '9') && ch != EOF; ch = getchar())if (ch == '-') s = -1;ll x = ch - '0';for (ch = getchar(); ch >= '0' && ch <= '9' && ch != EOF; ch = getchar()) x = x * 10 + (ch ^ 48);return x * s;
}struct BigInt {ll d[MAX_BITS];void init(ll x = 0) {for (int i = 0; i <= MAX_BITS - 5; ++i) d[i] = 0;for (int i = 0; x; ++i, x /= C) d[i] = x % C;}BigInt &operator+=(BigInt &x) {for (int i = 0; i <= MAX_BITS - 5; ++i)if ((d[i] += x.d[i]) >= C) ++d[i + 1], d[i] -= C;return *this;}BigInt operator*(BigInt &x) const {BigInt res; res.init();for (int i = 0; i <= MAX_BITS - 5; ++i)for (int j = 0; j <= i; ++j)if ((res.d[i] += d[j] * x.d[i - j]) >= C)res.d[i + 1] += res.d[i] / C, res.d[i] %= C;return res;}friend ostream &operator<<(ostream &s, const BigInt &x) {int i;for (i = MAX_BITS - 5; i >= 0 && !x.d[i]; --i);if (i < 0) return s << 0;s << x.d[i--];while (i >= 0) s << setw(8) << setfill('0') << x.d[i--];return s;}
} ans, sum;int main() {ios::sync_with_stdio(false); cin.tie(nullptr);n = read(); tp = read();if (!tp) for (int i = 1; i <= n; ++i) a[i] = read();else {int x, y, z, b1, b2, m;x = read(); y = read(); z = read();b1 = read(); b2 = read(); m = read();for (int i = 1, j = 1; j <= m; ++j) {int p, l, r; p = read(); l = read(); r = read();while (i <= p) {int b;if (i == 1) b = b1;else if (i == 2) b = b2;else {b = (((1ll * x * b2) & BIT) + ((1ll * y * b1) & BIT)) & BIT;(b += z) &= BIT;}a[i] = b % (r - l + 1) + l;if (i >= 3) b1 = b2, b2 = b;++i;}}}for (int i = 2; i <= n; ++i) a[i] += a[i - 1];f[1] = 0; q[++r] = 1;for (int i = 2; i <= n; ++i) {while (l < r && calc(q[l + 1]) <= a[i]) ++l;f[i] = (l <= r && calc(q[l]) <= a[i] ? q[l] : 0);while (l <= r && calc(q[r]) >= calc(i)) --r;q[++r] = i;}int p = n;while (p) {sum.init(a[p] - a[f[p]]);sum = sum * sum; ans += sum;p = f[p];}cout << ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857742.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乌鸡国

1-队伍进入副本以后,走到下图分岔点离队,每人负责一条线路,寻找树妖。2-寻找仙人,可以按照1的策略继续反方向走回去找仙人。3-寻找完仙人以后,会要求帮助国王清理荆棘木,五个号散开清理完即可。 4-进入皇宫,击杀拘灵妖怪、缚仙妖怪、囚神妖怪,需要在12回合内击杀三个妖…

梦幻神器-起-泪痕碗之念-2星

1-该任务需要5个随机指定三级药、7个2级家具,其中2级家具可以提前准备,三级药为NPC随机指定,无法提前准备。 2-前面跟着流程跑,第一场战斗是"清风",需要先击杀小怪,主怪清风在第四回合以后会说"我们放水吧",说了以后才可以击杀主怪清风。3-击杀清风…

STM32F103 SPI配置(SSD1306)

有关SPI通信协议我们在《通信协议-SPI》已经进行了详细的介绍,因此这一节不再重复介绍。 一、软件/硬件SPI 想要控制STM32产生SPI方式的通讯,可以采用软件模拟或硬件SPI这两种方式。 1.1 软件模拟 所谓软件模拟,即直接使用CPU内核按照SPI协议的要求控制GPIO输出高低电平。 1…

梦幻神器-起-莫愁铃之恩-1星

1-该任务需要提前准备5个三级药,金创药、佛光舍利子除外。 2-第一场战斗是击败地府守卫弟子,1星难度不大,注意"诡蝠之刑"的反伤即可,中了"诡蝠之刑"的单位可以适当防御。3-击杀地府守卫弟子以后跟着流程走,接下来需要给三个水晶注入灵气,需要先注入中…

我家一次用电超负荷时20A保险丝断了,但16A的空气开关却没有跳闸.

回答一: 转载自:https://zhidao.baidu.com/question/1970736314255432140.html这说明两者的保护时限不同。无论是保险丝还是空气开关,并不电流达到就立即跳,而且有一定的时间延时来积累热量,热量到了才会动作。 16A的空气开关没跳说明电流虽然超过20A,但时间很快,保险丝…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中,我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式 1. 传统的 Builder 方式 最基础的…

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结@目录二、高级篇(大厂进阶)2.DockerFile解析2.1 是什么2.2 DockerFile构建过程解析2.3 DockerFile常用保留字指令2.4案例2.4.1自定义镜像mycento…

按钮修改状态

首先创造函数void updateBaoxiaoSchedule( int id, String schedule, String schedulereason); 及其实现。 SQL语句: @Update("update submit set state=#{state},statereason=#{statereason} where id=#{id} ") void updateSubmit1( @Param("id") int id…

泰山派设备控制(RGB)

泰山派设备系统控制(RGB) 1、进入设备系统 cd /sys/class2、进入RGB灯子系统 cd /sys/class/leds/罗列可操作的设备,可以看到三个设备,“rgb-led-b”,“rgb-led-g”,“rgb-led-r”,分别对应RGB的蓝,绿,红。3、我们对其单一色灯进行操作 cd rgb-led-b4、ls罗列出可操作的…

《计算机组成及汇编语言原理》阅读笔记:p48-p81

《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a large block of data, perhaps a strin…

在VS2022中,“根据模型生成数据库”时报错:已添加了具有相同键的项(或:An item with the same key has already been added)

解决方法:关闭解决方案,打开解决方案所在文件夹,打开以下文件夹:.vs\ConsoleApp7\FileContentIndex,然后删除里面的所有文件,再重新在VS中打开解决方案重新生成即可

超级AI图像放大工具Upscayl:让你的照片细节更清晰,色彩更鲜艳!

前言 Hello大家好,我又来推荐非常好用的AI图片无损放大器,模糊图片秒变高清,Upscayl是一个免费开源的AI图像超分辨率工具。它使用AI模型来通过猜测细节的方式增强图像并提高其分辨率。该工具适用于Linux、macOS和Windows操作系统 安装环境 [名称]:Upscayl [大小]:400.99MB …