題解:CF2120E Lanes of Cars

根據貪心,不難想到每次會把最長隊伍末尾的那輛車移動到最短隊伍的末尾。但由于 k k k 的存在,會導致一些冗余移動的存在。設需要挪動 C C C 輛車,則怒氣值可以表示為 f ( C ) + k C f(C) + kC f(C)+kC,其中 f ( C ) f(C) f(C) 是排隊所產生的怒氣值, k C kC kC 為變道產生的額外怒氣值。仔細分析以后,可以發現這是一個凸函數,因此考慮三分答案。

一開始想要三分需要挪車的最短長度 y y y,但是不能忽略 k k k 的影響,有些隊伍的長度雖然 > y > y >y,但挪動不移動會更優。于是三分挪動車輛的數量才是最優的。

具體來說,可以枚舉哪些隊伍的車輛會減少/增加。若現在考慮會減少的隊伍的車輛,給 a i a_i ai? 排序后,設當前最長隊伍的車輛數為 x x x,次長的為 y y y ( x ≠ y x \neq y x=y),然后長度為 x , y x,y x,y 的隊伍的數量分別為 f x , f y f_x,f_y fx?,fy?。若共需要移動 C C C 輛車,則有兩種情況:

  • C ≥ ( x ? y ) × f x C \ge (x - y) \times f_x C(x?y)×fx?,也就是說長度為 x x x 的車可以直接變為 y y y C ← C ? ( x ? y ) × f x ; f y ← f x + f y ; f x ← 0 C \leftarrow C - (x - y) \times f_x;\ f_y \leftarrow f_x + f_y;\ f_x \leftarrow 0 CC?(x?y)×fx?;?fy?fx?+fy?;?fx?0

  • C < ( x ? y ) × f x C < (x - y) \times f_x C<(x?y)×fx?,此時會產生新的隊伍長度,也就是 C ← 0 ; f x ? ? C f x ? ? 1 ← f x ? ? C f x ? ? 1 + C m o d f x ; ← f x ? ? C f x ? + ( f x ? C m o d f x ) C \leftarrow 0;\ f_{x - \lfloor\frac{C}{f_x}\rfloor - 1} \leftarrow f_{x - \lfloor\frac{C}{f_x}\rfloor - 1} + C \bmod f_x;\ \leftarrow f_{x - \lfloor\frac{C}{f_x}\rfloor} + (f_x - C \bmod f_x) C0;?fx??fx?C???1?fx??fx?C???1?+Cmodfx?;?fx??fx?C???+(fx??Cmodfx?)

可以發現最后隊伍長度的種類數不會超過 n + 2 n + 2 n+2,因此這是 O ( n ) O(n) O(n) 的。考慮增加的隊伍的車輛同理,用 STL 來寫會簡單一點。但是由于多了一支 log ? \log log,實測會超時:

ll tot = sum * k,res = sum,number = sum;
set <int> s;map <int,int> bg,sm;
s.insert (-1e9);
for (int i = 1;i <= n;++i) s.insert (a[i]),++bg[a[i]];
while (sum)
{int x = *(--s.end ()),num = bg[x];s.erase (x);int y = *(--s.end ());if (sum >= 1ll * (x - y) * num){sum -= 1ll * (x - y) * num;bg[y] += num;bg[x] = 0;}else {bg[x] = 0;int tmp = sum % num;if (tmp) bg[x - sum / num - 1] += tmp;bg[x - sum / num] += num - tmp;sum = 0;}
}
s.clear ();
for (auto [x,num] : bg)if (num) s.insert (x),sm[x] = num;
s.insert (1e9);
while (res)
{int x = *s.begin (),num = sm[x];s.erase (x);int y = *s.begin ();if (res >= 1ll * (y - x) * num){res -= 1ll * (y - x) * num;sm[y] += num;sm[x] = 0;}else{sm[x] = 0;int tmp = res % num;if (tmp) sm[x + res / num + 1] += tmp;sm[x + res / num] += num - tmp;res = 0;}
}
for (auto [x,num] : sm) tot += 1ll * x * (x + 1) / 2 * num;
return tot;
};

再次思考可以發現 STL 的 log ? \log log 完全是多余的,可以通過數組來替代,但需要小心清空與去重的問題。最后的 AC 代碼如下,時間復雜度 O ( n log ? n ) O(n \log n) O(nlogn)

#include <bits/stdc++.h>
#define init(x) memset (x,0,sizeof (x))
#define ll long long
#define ull unsigned long long
#define INF 2e18
#define pii pair <int,int>
using namespace std;
const int MAX = 2e5 + 5;
const int MOD = 1e9 + 7;
inline int read ();
int a[MAX],b[MAX];
vector <int> bg (1000001,0),sm (1000001,0);
void solve ()
{int n = read (),k = read ();ll ans = INF;for (int i = 1;i <= n;++i) a[i] = read ();sort (a + 1,a + 1 + n);auto check = [&] (ll sum) -> ll{ll tot = sum * k,res = sum;int cnt = 0;vector <int> p;for (int i = 1;i <= n;++i) p.push_back (a[i]);for (int i = 1;i <= n;++i) {if (!bg[a[i]]) b[++cnt] = a[i];++bg[a[i]];}b[0] = -1e9;while (sum > 0){int x = b[cnt--],num = bg[x];int y = b[cnt];if (sum >= 1ll * (x - y) * num){sum -= 1ll * (x - y) * num;bg[y] += num;bg[x] = 0;}else {bg[x] = 0;int tmp = sum % num;bg[x - sum / num] += num - tmp,p.push_back (x - sum / num);if (tmp) bg[x - sum / num - 1] += tmp,p.push_back (x - sum / num - 1);sum = 0;}}cnt = 0;for (auto v : p)if (bg[v]) b[++cnt] = v,sm[v] = bg[v],bg[v] = 0;p.clear ();for (int i = 1;i <= cnt;++i) p.push_back (b[i]);b[++cnt] = 1e9;cnt = 1;while (res > 0){int x = b[cnt++],num = sm[x];int y = b[cnt];if (res >= 1ll * (y - x) * num){res -= 1ll * (y - x) * num;sm[y] += num;sm[x] = 0;}else{sm[x] = 0;int tmp = res % num;if (tmp) sm[x + res / num + 1] += tmp,p.push_back (x + res / num + 1);sm[x + res / num] += num - tmp,p.push_back (x + res / num);res = 0;}}for (auto v : p) tot += 1ll * v * (v + 1) / 2 * sm[v],sm[v] = 0;return tot;};ll l = 0,r = accumulate (a + 1,a + n + 1,0ll);while (l < r){ll midl = l + (r - l) / 3,midr = r - (r - l) / 3;ll v1 = check (midl),v2 = check (midr);ans = min (ans,min (v1,v2));if (v1 <= v2) r = midr - 1;else l = midl + 1;}printf ("%lld\n",ans);
}
int main ()
{int t = read ();while (t--) solve ();return 0;
}
inline int read ()
{int s = 0;int f = 1;char ch = getchar ();while ((ch < '0' || ch > '9') && ch != EOF){if (ch == '-') f = -1;ch = getchar ();}while (ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar ();}return s * f;
}

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

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

相關文章

Excel基礎:選擇和移動

本文演示Excel中基礎的選擇和移動操作&#xff0c;并在最后提供了一張思維導圖&#xff0c;方便記憶。 文章目錄 一、選擇1.1 基礎選擇1.1.1 選擇單個單元格1.1.2 選擇連續范圍 1.2 行列選擇1.2.1 選擇整行整列1.2.2 選擇多行多列 1.3 全選1.3.1 全選所有單元格1.3.2 智能選擇…

Java面試寶典:基礎四

80. int vs Integer 維度intInteger類型基本數據類型(8種之一)包裝類默認值0null應用場景性能敏感場景(計算密集)Web表單、ORM框架(區分null和0)特殊能力無提供工具方法(如parseInt())和常量(如MAX_VALUE)示例:

RabbitMQ + JMeter 深度集成指南:中間件性能優化全流程解析!

在 2025 年的數字化浪潮中&#xff0c;中間件性能直接決定系統的穩定性和用戶體驗&#xff0c;而 RabbitMQ 作為消息隊列的“老大哥”&#xff0c;在分布式系統中扮演著關鍵角色。然而&#xff0c;高并發場景下&#xff0c;消息堆積、延遲激增等問題可能讓系統不堪重負&#xf…

uniapp image引用本地圖片不顯示問題

1. uniapp image引用本地圖片不顯示問題 在uniapp 開發過程中采用image引入本地資源圖片。 1.1. 相對路徑和絕對路徑問題 在UniApp中開發微信小程序時&#xff0c;引入圖片時&#xff0c;相對路徑和絕對路徑可能會有一些差異。這差異主要涉及到小程序和UniApp框架的文件結構、…

論文閱讀:arxiv 2025 ThinkSwitcher: When to Think Hard, When to Think Fast

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 ThinkSwitcher: When to Think Hard, When to Think Fast https://arxiv.org/pdf/2505.14183#page2.08 https://www.doubao.com/chat/10031179784579842 文章目錄 速覽一、…

智能體記憶原理-prompt設計

智能體記憶的管理與設計開發分為以下幾步&#xff1a; 1.記憶的抽取&#xff1b; 2.記憶的存儲&#xff1b; 3.記憶的搜索&#xff1b; 一、記憶抽取一&#xff1a; FACT_RETRIEVAL_PROMPT f"""你是一位個人信息整理助手&#xff0c;專門負責準確存儲事實、用…

026 在線文檔管理系統技術架構解析:基于 Spring Boot 的企業級文檔管理平臺

在線文檔管理系統技術架構解析&#xff1a;基于Spring Boot的企業級文檔管理平臺 在企業數字化轉型的進程中&#xff0c;高效的文檔管理系統已成為提升協作效率的核心基礎設施。本文將深入解析基于Spring Boot框架構建的在線文檔管理系統&#xff0c;該系統整合公告信息管理、…

AWTK-MVVM的一些使用技巧總結(1)

在項目中用了一段時間的AWTK-MVVM框架&#xff0c;由于AWTK-MVVM本身的文檔十分欠缺&#xff0c;自己經過一段時間的研究折騰出了幾個技巧&#xff0c;在此記錄總結。 用fscript啟用傳統UI代碼 AWTK-MVVM里面重新設計了navigator機制&#xff0c;重定位了navigator_to的調用方…

openwrt使用quilt工具制作補丁

前言&#xff1a;簡單聊一下為什么需要制作補丁&#xff0c;因為openwrt的編譯是去下載很多組件放到dl目錄下面&#xff0c;這些組件都是壓縮包。如果我們要修改這些組件里面的源碼&#xff0c;就需要對這些組件打pacth&#xff0c;也就是把我們的差異點在編譯的時候合入到對應…

強化學習 (1)基本概念

grid-world example 一個由多個格子組成的二維網格 三種格子&#xff1a;accessible可通行的&#xff1b; forbidden禁止通行的&#xff1b; target目標 state狀態 state是智能體相對于環境的狀態&#xff08;情況&#xff09; 在grid-world example里&#xff0c;state指的…

【Typst】縱向時間軸

概述 6月10日實驗了一個縱向時間軸排版效果&#xff0c;當時沒有做成單獨的模塊&#xff0c;也存在一些Bug。 今天(6月29日)在原基礎上進行了一些改進&#xff0c;并總結為模塊。 目前暫時發布出來&#xff0c;可用&#xff0c;后續可能會進行大改。 使用案例 導入模塊使用…

【Visual Studio Code上傳文件到服務器】

在 Visual Studio Code (VS Code) 中上傳文件到 Linux 系統主要通過 SSH 協議實現&#xff0c;結合圖形界面&#xff08;GUI&#xff09;或命令行工具操作。以下是具體說明及進度查看、斷點續傳的實現方法&#xff1a; ?? 一、VS Code 上傳文件到 Linux 的機制 SSH 遠程連接 …

手機控車一鍵啟動汽車智能鑰匙

手機一鍵啟動車輛的方法 手機一鍵啟動車輛是一種便捷的汽車啟動方式&#xff0c;它通過智能手機應用程序實現對車輛的遠程控制。以下是詳細的步驟&#xff1a; 完成必要的認證與激活步驟。打開手機上的相關移動管家手機控車APP&#xff0c;并與車載藍牙建立連接。在APP的主界面…

基于深度學習的語音增強技術:時間增強多尺度頻域卷積網絡模型解析

基于深度學習的語音增強技術&#xff1a;時間增強多尺度頻域卷積網絡模型解析 近年來&#xff0c;隨著語音處理技術的不斷發展&#xff0c;語音增強&#xff08;Speech Enhancement&#xff09;逐漸成為研究熱點。語音增強的主要目標是通過消除噪聲和改善信噪比來提高語音質量…

計算機組成原理-數據表示與運算(三)

### 文字提取結果&#xff1a; #### 題目內容&#xff1a; 34. 【2009 統考真題】浮點數加、減運算過程一般包括對階、尾數運算、規格化、舍入和判斷溢出等步驟。設浮點數的階碼和尾數均采用補碼表示&#xff0c;且位數分別為 5 和 7&#xff08;均含 2 位符號位&#xff09;。…

Learning Fully Convolutional Networks for Iterative Non-blind Deconvolution論文閱讀

Learning Fully Convolutional Networks for Iterative Non-blind Deconvolution 1. 研究目標與實際問題1.1 研究目標1.2 實際意義2. 創新方法與模型設計2.1 核心框架:迭代式梯度域處理2.1.1 模型架構2.2 關鍵技術實現2.2.1 梯度域去噪網絡2.2.2 解卷積模塊(核心公式實現)2.…

Vue3——組件傳值

父傳子 props ——最推薦的方法&#xff08;TOP1級別&#xff09; 父組件文件 <sidebar :text"textname" ></sidebar> //父組件通過 :text 將父組件的數據textname傳遞給子組件 const textname:Ref<dataFather[]> ref([{name:劉亦菲,age:18 },…

DOP數據開放平臺(真實線上項目)

什么是數據開放平臺&#xff1f; 數據開放平臺是一種通過公開應用程序編程接口&#xff08;API&#xff09;或結構化數據&#xff0c;允許第三方開發者或機構訪問、使用和共享數據的平臺?&#xff0c;旨在促進數據流通、打破信息孤島并激發創新應用。 DOP數據開放平臺簡單演示…

InfluxDB 3 Core數據庫管理指南:從概念到實操的完整流程

本文深入解析InfluxDB 3 Core的數據庫管理核心概念&#xff0c;涵蓋數據庫與歷史版本的兼容性差異、關鍵限制&#xff08;數據庫/表/列數量&#xff09;、以及創建/查看/刪除數據庫的完整命令行操作。通過結構化流程和實用建議&#xff0c;幫助用戶高效管理時序數據存儲&#x…

JVM(11)——詳解CMS垃圾回收器

CMS (Concurrent Mark-Sweep) 垃圾回收器。它是 JDK 1.4 后期引入&#xff0c;并在 JDK 5 - JDK 8 期間廣泛使用的一種以低停頓時間 (Low Pause Time) 為主要目標的老年代垃圾回收器。它是 G1 出現之前解決 Full GC 長停頓問題的主要方案。 一、CMS 的設計目標與定位 核心目標…