LG5504 [JSOI2011] 柠檬 题解

news/2025/2/11 19:41:10/文章来源:https://www.cnblogs.com/BigSmall-En/p/18710358

LG5504 [JSOI2011] 柠檬

\(\text{Flute}\) 很喜欢柠檬。它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬。贝壳一共有 \(n\) \((1≤n≤100000)\) 只,按顺序串在树枝上。为了方便,我们从左到右给贝壳编号 \(1..n\) 。每只贝壳的大小不一定相同,贝壳 \(i\) 的大小为 \(a_i(1≤a_i≤10000)\)

变柠檬的魔法要求\(:\ \text{Flute}\) 每次从树枝一端取下一小段连续的贝壳,并选择一种贝壳的大小 \(a_0\)。如果这一小段贝壳中大小为 \(a_0\) 的贝壳有 \(t\) 只,那么魔法可以把这一小段贝壳变成 \(a_0t^2\) 只柠檬。\(\text{Flute}\) 可以取任意多次贝壳,直到树枝上的贝壳被全部取完。各个小段中,\(\text{Flute}\) 选择的贝壳大小 \(a_0\) 可以不同。而最终 \(\text{Flute}\) 得到的柠檬数,就是所有小段柠檬数的总和。

\(\text{Flute}\) 想知道,它最多能用这一串贝壳变出多少柠檬。请你帮忙解决这个问题。

显然每一段两端的贝壳大小相等是最优的,否则可以额外增加一段产生贡献。

\(dp_i\) 表示前 \(i\) 个贝壳的答案,\(s_i\) 表示前 \(i\) 个贝壳中与 \(a_i\) 相等的贝壳个数。然后假设 \(dp_i\) 可以从 \(dp_j,dp_k\) 转移得到(不妨 \(k<j<i\)),有

\[dp_i=\max(dp_j+a_i\times(s_i-s_j)^2,dp_k+a_i\times(s_i-s_k)^2) \]

当从 \(j\) 转移更优时,有

\[dp_j+a_i\times (s_i-s_j)^2>dp_k+a\times (s_i-s_k)^2\\ dp_j+a_i s_i^2-2a s_is_j+as_j^2>dp_k+as_i^2-2as_is_k+as_k^2\\ (dp_j+as_j^2)-(dp_k+as_k^2)>2as_i(s_j-s_k)\\ \frac{(dp_j+as_j^2)-(dp_k+as_k^2)}{s_j-s_k}>2as_i \]

然后把 \((s_i,dp_j+as_j^2)\) 看作决策点,使用单调栈维护上凸包即可。

其他就是实现问题,然而写了快 \(2\) 个小时,发现自己写得真的丑,学习别人的又写了一版。(理论上斜率用 double 写会更直观,不过怕掉精度就没用)

#include <bits/stdc++.h>using namespace std;typedef long long ll;
typedef pair<int,int>ttfa;
const int N=200005;int n,a[N],num[N];
ll sum[N],yval[N],xval[N],dp[N];
vector<int>stk[N];#define t1 stk[v][stk[v].size()-1]
#define t2 stk[v][stk[v].size()-2]int main(){scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);sum[i]=++num[a[i]];}stk[a[1]].push_back(0);for(int i=1;i<=n;++i){ll v=a[i];while(stk[v].size()>=2&&yval[t1]-yval[t2]<=2*v*sum[i]*(xval[t1]-xval[t2]))stk[v].pop_back();dp[i]=dp[t1]+v*(sum[i]-xval[t1])*(sum[i]-xval[t1]);v=a[i+1];xval[i]=sum[i+1]-1;yval[i]=dp[i]+v*xval[i]*xval[i];while(stk[v].size()>=2&&(yval[i]-yval[t1])*(xval[t1]-xval[t2])>(yval[t1]-yval[t2])*(xval[i]-xval[t1]))stk[v].pop_back();stk[v].push_back(i);}printf("%lld\n",dp[n]);return 0;
}

贴到博客上来提醒一下自己。

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

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

相关文章

另辟新径实现 Blazor/MAUI 本机交互(三)

新建一个Maui blazor工程, 下面是工程关键文件解析. MainPage.xaml.cs 构造函数:通过 FindByName 方法查找名为 webView 的 WebView 控件,并将其赋值给 wvBrowser 变量。 创建 NativeBridge 的实例 api,并将 wvBrowser 传递给它。 使用 api.AddTarget 方法添加一个名为 dial…

nodejs如何处理Token?一文深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

前端开发中关于Token的那些事儿:深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

Eddystone 与 iBeacon

Eddystone 与 iBeacon 蓝牙信标 (Beacons) 是一种单向通讯方式,所以一般的用途就是发送提醒。 Beacons 是指使用蓝牙4.0(BLE)技术发射信号的小设备。 目前存活的 Beacons 标准有两个,分别是 Google 的 Eddystone 和 Apple 的 iBeacon. Eddystone Eddystone 是谷歌基于 Beac…

OrangePi 5 编译 Android12 源码

OrangePi 5 编译 Android12 源码 材料准备 源码下载地址 Orange Pi - Orangepi官方教程编译环境 在以下环境的 Ubuntu 虚拟机编译通过,基于 VMware Workstation 17 Pro.系统版本:ubuntu-18.04.6-lts-desktop-amd64; CPU:i5-8400,为 VM 分配 4 核; 内存:8G RAM + 16G swap…

Maui 基础 - Preferences 存储和检索应用程序的首选项

Maui 基础 Preferences 是 .NET MAUI 提供的一个静态类,用于存储和检索应用程序的首选项(即设置或配置)。它提供了一种简单的键值对存储机制,可以跨平台使用。每个平台使用其本地的存储机制来实现这些功能,例如:iOS 使用 NSUserDefaults Android 使用 SharedPreferences …

另辟新径实现 Blazor/MAUI 本机交互(一)

本系列由浅入深逐个文件解析工作原理 目录:WebViewNativeApi.cs NativeApi.cs MainPage.xaml.cs 实战 串口 小票机 蓝牙WebViewNativeApi.cs WebViewNativeApi.cs 文件中的代码实现了一个 NativeBridge 类,用于在 .NET MAUI 应用程序中的 WebView 和本地代码之间进行通信。以下…

AI 如何重塑劳动力市场:基于 Claude 数据的深度分析

前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总。 引言 在未来的几年里,人工智能系统将对人们的工作方式产生重大影响。因此,我们推出了 Anthropic Economic Index,这是一个旨…

Nacos Python SDK 强势来袭,动态管理大模型 Prompt!

Nacos 从 0.8.0 版本开始就一直参与 Python 生态建设,努力作为 Python 生态中分布式微服务发现和配置管理的解决方案一直往前演进。目前随着 AI 领域的发展,Nacos 社区的 Python 开发者用户越来越多,因此这次我们迭代了 Python 的 GA 稳定版本,对不少历史问题做了修复以及易…

踩坑记录-二分搜索的不同情况

二分搜索的不同情况 二分搜索可以用来查找满足条件的值,但是满足条件的值可能只有1个,也可能有多个。比如查找1的索引,对于【1,1,2,2】来说,就有2个。一般要求的就是:满足条件最大值/满足条件最小值。 二分搜索详细介绍可以参考:https://programmercarl.com/0704.二分…

《ESP32-S3使用指南—IDF版 V1.6》第五章 搭建开发环境

第五章 搭建开发环境 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/AT…

内测之家介绍

内测之家:助力应用开发与迭代的专业平台内测之家是一款功能强大且全面的应用内测与管理平台,专为 iOS 和 Android 开发者打造,旨在为他们提供便捷高效、安全可靠的一站式服务。无论是从资源安全到传输安全,还是从数据保护到应用管理、统计分析,内测之家都展现出卓越的能力…