洛谷 P3628/SPOJ 15648 APIO2010 特別行動隊 Commando

題意

你有一支由 n n n 名預備役士兵組成的部隊,士兵從 1 1 1 n n n 編號,你要將他們拆分成若干特別行動隊調入戰場。出于默契的考慮,同一支特別行動隊中隊員的編號應該連續,即為形如 i , i + 1 , ? , i + k i, i + 1, \cdots ,i + k i,i+1,?,i+k的序列。所有的隊員都應該屬于且僅屬于一支特別行動隊。

編號為 i i i 的士兵的初始戰斗力為 x i x_i xi? ,一支特別行動隊的初始戰斗力 X X X 為隊內士兵初始戰斗力之和,即 X = x i + x i + 1 + ? + x i + k X = x_i + x_{i+1} + \cdots + x_{i+k} X=xi?+xi+1?+?+xi+k?

通過長期的觀察,你總結出對于一支初始戰斗力為 X X X 的特別行動隊,其修正戰斗力 X ′ = a X 2 + b X + c X'= aX^2+bX+c X=aX2+bX+c,其中 a , b , c a,~b,~c a,?b,?c 是已知的系數。 作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊的修正戰斗力之和最大。試求出這個最大和。

1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1n106 ? 5 ≤ a ≤ ? 1 -5 \leq a \leq -1 ?5a?1 ? 1 0 7 ≤ b , c ≤ 1 0 7 -10^7 \leq b,c \leq 10^7 ?107b,c107 1 ≤ x i ≤ 100 1 \leq x_i \leq 100 1xi?100

思路

先考慮樸素的 dp,令 f i f_i fi? 表示將前 i i i 個人分隊完畢的最大戰斗力,設:
s i = ∑ j = 1 i x i , z ( x ) = a x 2 + b x + c s_i=\sum_{j=1}^{i}x_i,\ z(x)=ax^2+bx+c si?=j=1i?xi?,?z(x)=ax2+bx+c

那么有:
f i = max ? j ∈ [ 1 , i ) { f j + z ( s i ? s j ) } f_i=\max_{j\in[1,i)}\left \{f_j+z(s_i-s_j)\right \} fi?=j[1,i)max?{fj?+z(si??sj?)}

去到了 Θ ( n 2 ) \Theta(n^2) Θ(n2) 級別。由上一篇題解的經驗,考慮使用斜率優化掉找 j j j Θ ( n ) \Theta(n) Θ(n)

設有決策點 j 1 j1 j1 j 2 j2 j2 j 2 j2 j2 優于 j 1 j1 j1,那么:
f j 1 + z ( s i ? s j 1 ) ≤ f j 2 + z ( s i ? s j 2 ) f_{j1}+z(s_i-s_{j1})\le f_{j2}+z(s_i-s_{j2}) fj1?+z(si??sj1?)fj2?+z(si??sj2?)

f j 1 + a ( s i ? s j 1 ) 2 + b ( s i ? s j 1 ) ≤ f j 2 + a ( s i ? s j 2 ) 2 + b ( s i ? s j 2 ) f_{j1}+a(s_i-s_{j1})^2+b(s_i-s_{j1})\le f_{j2}+a(s_i-s_{j2})^2+b(s_i-s{j2}) fj1?+a(si??sj1?)2+b(si??sj1?)fj2?+a(si??sj2?)2+b(si??sj2)

f j 1 + a s i 2 + a s j 1 2 ? 2 a s i s j 1 + b s i ? b s j 1 ≤ f j 2 + a s i 2 + a s j 2 2 ? 2 a s i s j 2 + b s i ? b s j 2 f_{j1}+as_i^2+as_{j1}^2-2as_is_{j1}+bs_i-bs_{j1}\le f_{j2}+as_i^2+as_{j2}^2-2as_is_{j2}+bs_i-bs_{j2} fj1?+asi2?+asj12??2asi?sj1?+bsi??bsj1?fj2?+asi2?+asj22??2asi?sj2?+bsi??bsj2?

f j 1 ? f j 2 ? b s j 1 + b s j 2 + a s j 1 2 ? a s j 2 2 ≤ 2 a s i s j 1 ? 2 a s i s j 2 f_{j1}-f_{j2}-bs_{j1}+bs_{j2}+as_{j1}^2-as_{j2}^2\le 2as_is_{j1}-2as_is_{j2} fj1??fj2??bsj1?+bsj2?+asj12??asj22?2asi?sj1??2asi?sj2?

f j 1 ? f j 2 ? b ( s j 1 ? s j 2 ) + a ( s j 1 2 ? s j 2 2 ) ≤ 2 a s i ( s j 1 ? s j 2 ) f_{j1}-f_{j2}-b(s_{j1}-s_{j2})+a(s_{j1}^2-s_{j2}^2)\le 2as_i(s_{j1}-s_{j2}) fj1??fj2??b(sj1??sj2?)+a(sj12??sj22?)2asi?(sj1??sj2?)

因為 s j 1 < s j 2 s_{j1}<s_{j2} sj1?<sj2?,因而注意變號:
f j 1 ? f j 2 ? b ( s j 1 ? s j 2 ) + a ( s j 1 2 ? s j 2 2 ) 2 a ( s j 1 ? s j 2 ) ≥ s i \frac{f_{j1}-f_{j2}-b(s_{j1}-s_{j2})+a(s_{j1}^2-s_{j2}^2)}{2a(s_{j1}-s_{j2})}\ge s_i 2a(sj1??sj2?)fj1??fj2??b(sj1??sj2?)+a(sj12??sj22?)?si?

那就不妨拿個 g i = a s i 2 + b s i g_i=as_i^2+bs_i gi?=asi2?+bsi? 來代換了:
f j 1 ? f j 2 + g j 1 ? g j 2 2 a ( s j 1 ? s j 2 ) ≥ s i \frac{f_{j1}-f_{j2}+g_{j1}-g_{j2}}{2a(s_{j1}-s_{j2})}\ge s_i 2a(sj1??sj2?)fj1??fj2?+gj1??gj2??si?

斜率 s l o p e ≥ s i slope\ge s_i slopesi? s i s_i si? 單增,由下圖,扔到符合條件區間的尾巴去。

在這里插入圖片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define dd double
const ll N=1e6+9,inf=0x3f3f3f3f;
ll n,a,b,c,x[N];
ll s[N],g[N],f[N],q[N];
ll _2(ll x)
{return x*x;
}
ll z(ll x)
{return a*_2(x)+b*x+c;
}
dd slope(ll j1,ll j2)
{return (dd)(f[j1]-f[j2]+g[j1]-g[j2])/(dd)(2*a*(s[j1]-s[j2]));
}
int main()
{scanf("%lld%lld%lld%lld",&n,&a,&b,&c);for(int i=1;i<=n;i++){scanf("%lld",&x[i]);s[i]=s[i-1]+x[i];g[i]=a*_2(s[i])-b*s[i];}memset(f,-inf,sizeof(f));ll hh=0,tt=0;f[0]=0;for(int i=1;i<=n;i++){while(hh<tt&&slope(q[hh],q[hh+1])<=s[i])hh++;//slope>s[i]單增,扔隊尾 f[i]=f[q[hh]]+z(s[i]-s[q[hh]]);while(hh<tt&&slope(q[tt],i)<slope(q[tt-1],q[tt]))tt--;q[++tt]=i;}printf("%lld",f[n]);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70721.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCL源碼分析:曲面法向量采樣

文章目錄 一、簡介二、源碼分析三、實現效果參考資料一、簡介 曲面法向量點云采樣,整個過程如下所述: 1、空間劃分:使用遞歸方法將點云劃分為更小的區域, 每次劃分選擇一個維度(X、Y 或 Z),將點云分為兩部分,直到劃分區域內的點少于我們指定的數量,開始進行區域隨機采…

Go語言--語法基礎2--下載安裝

2、下載安裝 1、下載源碼包&#xff1a; go1.18.4.linux-amd64.tar.gz。 官方地址&#xff1a;https://golang.google.cn/dl/ 云盤地址&#xff1a;鏈接&#xff1a; https://pan.baidu.com/s/1N2jrRHaPibvmmNFep3VYag 提 取碼&#xff1a; zkc3 2、將下載的源碼包解壓…

lowagie(itext)老版本手繪PDF,包含頁碼、水印、圖片、復選框、復雜行列合并等。

入口類&#xff1a;exportPdf ? package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…

3-2 WPS JS宏 工作簿的打開與保存(模板批量另存為工作)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

Ubuntu20.04之VNC的安裝使用與常見問題

Ubuntu20.04之VNC的安裝與使用 安裝圖形桌面選擇安裝gnome桌面選擇安裝xface桌面 VNC-Server安裝配置開機自啟 VNC Clientroot用戶無法登入問題臨時方案永久方案 安裝圖形桌面 Ubuntu20.04主流的圖形桌面有gnome和xface兩種&#xff0c;兩種桌面的安裝方式我都會寫&#xff0c…

Day46 反轉字符串

I. 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 class Solution {public void reverseString(char[] s) {int i …

用FileZilla Server 1.9.4給Windows Server 2025搭建FTP服務端

FileZilla Server 是一款免費的開源 FTP 和 FTPS 服務器軟件&#xff0c;分為服務器版和客戶端版。服務器版原本只支持Windows操作系統&#xff0c;比如筆者曾長期使用過0.9.60版&#xff0c;那時候就只支持Windows操作系統。當時我們生產環境對FTP穩定性要求較高&#xff0c;比…

【愚公系列】《Python網絡爬蟲從入門到精通》033-DataFrame的數據排序

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

營銷過程烏龜圖模版

營銷過程烏龜圖模版 輸入 公司現狀產品服務客戶問詢客戶期望電話、電腦系統品牌軟件硬件材料 售前 - 溝通 - 確定需求 - 滿足需求 - 售后 機料環 電話、電腦等設備軟件硬件、系統品牌等工具材料 人 責任人協助者生產者客戶 法 訂單由誰評審控制程序營銷過程控制程序顧客滿意度…

Kubernetes (K8S) 高效使用技巧與實踐指南

Kubernetes&#xff08;K8S&#xff09;作為容器編排領域的核心工具&#xff0c;其靈活性和復雜性并存。本文結合實戰經驗&#xff0c;從運維效率提升、生產環境避坑、核心功能應用等維度&#xff0c;總結高頻使用技巧與最佳實踐&#xff0c;分享如何快速掌握 K8S。 一、kubect…

Idea java項目結構介紹

一般來說&#xff0c;一個典型的 IntelliJ IDEA Java 項目具有特定的結構&#xff0c;以下是對其主要部分的介紹&#xff1a; 項目根目錄 項目的最頂層目錄&#xff0c;包含了整個項目的所有文件和文件夾&#xff0c;通常以項目名稱命名。在這個目錄下可以找到.idea文件夾、.g…

C++大整數類的設計與實現

1. 簡介 我們知道現代的計算機大多數都是64位的&#xff0c;因此能處理最大整數為 2 64 ? 1 2^{64}-1 264?1。那如果是超過了這個數怎么辦呢&#xff0c;那就需要我們自己手動模擬數的加減乘除了。 2. 思路 我們可以用一個數組來存儲大數&#xff0c;數組中的每一個位置表…

2024年第十五屆藍橋杯大賽軟件賽省賽Python大學A組真題解析

文章目錄 試題A: 拼正方形(本題總分:5 分)解析答案試題B: 召喚數學精靈(本題總分:5 分)解析答案試題C: 數字詩意解析答案試題A: 拼正方形(本題總分:5 分) 【問題描述】 小藍正在玩拼圖游戲,他有7385137888721 個2 2 的方塊和10470245 個1 1 的方塊,他需要從中挑出一些…

開源RAG主流框架有哪些?如何選型?

開源RAG主流框架有哪些?如何選型? 一、開源RAG框架全景圖 (一)核心框架類型對比 類型典型工具技術特征適用場景傳統RAGLangChain, Haystack線性流程(檢索→生成)通用問答、知識庫檢索增強型RAGRAGFlow, AutoRAG支持重排序、多路召回優化高精度問答、復雜文檔處理輕量級…

Java SE與Java EE

Java SE&#xff08;Java 平臺標準版&#xff09; Java SE 是 Java 平臺的核心&#xff0c;提供了 Java 語言的基礎功能。它包含了 Java 開發工具包&#xff08;JDK&#xff09;&#xff0c;其中有 Java 編譯器&#xff08;javac&#xff09;、Java 虛擬機&#xff08;JVM&…

【Java企業生態系統的演進】從單體J2EE到云原生微服務

Java企業生態系統的演進&#xff1a;從單體J2EE到云原生微服務 目錄標題 Java企業生態系統的演進&#xff1a;從單體J2EE到云原生微服務摘要1. 引言2. 整體框架演進&#xff1a;從原始Java到Spring Cloud2.1 原始Java階段&#xff08;1995-1999&#xff09;2.2 J2EE階段&#x…

kicad中R樹的使用

在 KiCad 中&#xff0c;使用 R樹&#xff08;R-tree&#xff09;進行空間索引和加速查詢通常不在用戶層面直接操作&#xff0c;而是作為工具的一部分用于優化電路板設計的性能&#xff0c;尤其在布局、碰撞檢測、設計規則檢查&#xff08;DRC&#xff09;以及元件搜索等方面。…

org.springframework.boot不存在的其中一個解決辦法

最近做項目的時候發現問題&#xff0c;改了幾次pom.xml文件之后突然發現項目中的注解全部爆紅。 可以嘗試點擊左上角的循環小圖標&#xff0c;同步所有maven項目。 建議順便檢查一下Project Structure中的SDK和Language Level是否對應&#xff0c;否則可能報類似&#xff1a;“…

C語言實現通訊錄項目

一、通訊錄功能 實現一個可以存放100個人的信息的通訊錄&#xff08;這里采用靜態版本&#xff09;&#xff0c;每個人的信息有姓名、性別、年齡、電話、地址等。 通訊錄可以執行的操作有添加聯系人信息、刪除指定聯系人、查找指定聯系人信息、修改指定聯系人信息、顯示聯系人信…

HO3D_v3(handposeX-json 格式)數據集-release >> DataBall

注意&#xff1a; 1)為了方便使用&#xff0c;按照 handposeX json 自定義格式存儲 2)使用常見依賴庫進行調用,降低數據集使用難度。 3)部分數據集獲取請加入&#xff1a;DataBall-X數據球(free) 4)完整數據集獲取請加入&#xff1a;DataBall-X數據球(vip) HO3D 數據集官方…