BZOJ 5249: [2018多省省隊聯測]IIIDX(貪心 + 線段樹)

題意

這一天,\(\mathrm{Konano}\) 接到了一個任務,他需要給正在制作中的游戲 \(\mathrm{《IIIDX》}\) 安排曲目 的解鎖順序。游戲內共有\(n\) 首曲目,每首曲目都會有一個難度 \(d\) ,游戲內第 \(i\) 首曲目會在玩家 Pass 第 \(\lfloor \frac{i}{k} \rfloor\) 首曲目后解鎖( \(\lfloor x \rfloor\) 為下取整符號)若 \(\lfloor \frac{i}{k} \rfloor = 0\) ,則說明這首曲目無需解鎖

舉個例子:當 \(k = 2\) 時,第 \(1\) 首曲目是無需解鎖的( \(\lfloor \frac{1}{2} \rfloor = 0\) ),第 \(7\) 首曲目需要玩家Pass 第 \(\lfloor \frac{7}{2} \rfloor= 3\) 首曲目才會被解鎖。

\(\mathrm{Konano}\) 的工作,便是安排這些曲目的順序,使得每次解鎖出的曲子的難度不低于作為條件需要玩家通關的曲子的難度,即使得確定順序后的曲目的難度對于每個 \(i\) 滿足

\[d_i \geq d_{\lfloor \frac{i}{k} \rfloor}\]

當然這難不倒曾經在信息學競賽摸魚許久的 \(\mathrm{Konano}\) 。那假如是你,你會怎么解決這份任務呢?

\((1 \le n \le 500000, 1 \le k,d \le 10^9)\)

題解

一開始只想到了樹上貪心的思路qwq 但是拍了幾組就發現錯了

原來是 \(d_i\) 互不相同的時候是對的 相同的時候就會被 \(hack\) 掉 這個很容易舉出反例

還是簡單講一下貪心思路吧...

我們發現這個題目可以轉化成一個樹上問題 (因為每個點有且僅有一個父親(前驅節點)和它有關系)

就是使得原序列字典序盡量大 并且每對父子要滿足兒子權值大于等于父親

不難發現這個我們直接把這棵樹建出來 然后按后序遍歷倒著分配編號就行了 (可以自行模擬一下qwq)

意思就是我們每次貪心地使得序列在前面的點字典序盡量大 并且 它后面有足夠空間來分配的最優方案

?

這個可以用來做正解的思路 我們考慮 序列從前往后 單獨考慮

我們肯定需要當前這個最優 但后面我們不能就草莽就做下決定

所以我們可以考慮 根的為子樹預留空位 的貪心

這個我們舉 題解 的一個例子來考慮吧

我們將原 \(d\) 數組降序排列 例如

\[9,8,7,6,5,5,5,5,4,3,2\]

我們令 \(F_i\) 表示第 \(i\) 個結點左邊預留了的位置個數 那么 \((i-F_i)\) 就是 \(i\) 左邊可用數的數量..

假設結點 \(1\) 的子樹大小為 \(7\) 那么我第 \(1\) 個結點的值即為第 \(7\) 大的數 , \(5\)

我們把最右邊的 \(5\) (第 \(9\) 位) 給第 \(1\) 個結點

那么我們需要在 \([1,8]\) 區間中預定 \(6\) 個數給第 \(1\) 個結點的子樹

?

接著對于第 \(2\) 個結點 (設其子樹大小為 \(s\) )

找到一個 盡量靠左 的位置 \(x\) ( 盡量大 ) 使得 \(x\) 右側的可用數量都不少于 \(x\)

\[\displaystyle \min_{\forall i \ge x, (i-F_i) \ge s} x\]

而且到第 \(i\) 個點如果有父親的話 , 父親的預定額就可以去掉了 ( 只去掉一次 )

但保留父親占的那一個位置就行了

然后這樣就可以保證合法 并且 答案最優了

其實我想講的是如何用線段樹實現這個過程2333

我們其實只要開一顆支持 區間加減 + 區間最小值 的線段樹就行了

維護一段區間 \(i-F_i\) 的最小值 我們就可以將那個 \(\forall\) 變成判一個了qwq

如果這段區間這個最小值不可行 并不直接代表整個區間不存在解 但代表如果整個區間全選上是不行的

然后我們取預定額的時候 把后面點需要預定的全都都減去那么多就行了

?

重點是如何查找那個盡量靠左的位置

你先考慮右區間是否可行 如果右區間 當前 不可行 那么左區間 整個 必不可行 那么直接去右區間看是否有解就行了

如果右區間全部都可行 那么我們去左區間看看是否可行 不進行回溯

如果左區間到底的話發現不可行 那么這個點 在原序列后一個就可行了

?

有一個小問題 如果這樣預留的話 可能查的時候就把那個預留位置給占了啊qwq

但這種情況并不會出現的 因為你當前想要走到左子樹 那么右子樹必須全部滿足

但你之前把右區間一個點直接減到不能走了 所以絕對是不可以出現這種情況的qwq (相當于右區間對左區間 \(chkmin\) )

代碼

/**************************************************************Problem: 5249User: zjp_shadowLanguage: C++Result: AcceptedTime:5244 msMemory:28644 kb
****************************************************************/#include <bits/stdc++.h>
#define For(i, l, r) for(int i = (l), i##end = (r); i <= i##end; ++i)
#define Fordown(i, r, l) for(int i = (r), i##end = (l); i >= i##end; --i)
#define Set(a, v) memeset(a, v, sizeof(a))
using namespace std;inline bool chkmin(int &a, int b) { return b < a ? a = b, 1 : 0; }
inline bool chkmax(int &a, int b) { return b > a ? a = b, 1 : 0; }inline int read() {int x = 0, fh = 1; char ch = getchar();for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);return x * fh;
}void File() {freopen ("iiidx.in", "r", stdin);freopen ("iiidx.out", "w", stdout);
}double k;
const int N = 500100;#define lson o << 1, l, mid
#define rson o << 1 | 1, mid + 1, r
#define Del(o, v) tag[(o)] += (v), minv[(o)] -= (v);
struct Segment_Tree {int tag[N << 2], minv[N << 2];void push_down(int o) {if (!tag[o]) return; Del(o << 1, tag[o]); Del(o << 1 | 1, tag[o]); tag[o] = 0;}void push_up(int o) { minv[o] = min(minv[o << 1], minv[o << 1 | 1]); }void Build(int o, int l, int r) { tag[o] = 0 ; if (l == r) { minv[o] = l; return ; }int mid = (l + r) >> 1; Build(lson); Build(rson); push_up(o);}void Update(int o, int l, int r, int ul, int ur, int uv) {if (ul <= l && r <= ur) { Del(o, uv); return; }int mid = (l + r) >> 1; push_down(o);if (ul <= mid) Update(lson, ul, ur, uv);if (ur > mid) Update(rson, ul, ur, uv);push_up(o);}int Query(int o, int l, int r, int qv) {if (l == r) return (minv[o] >= qv ? l : l + 1);int mid = (l + r) >> 1, res = 0; push_down(o); if (minv[o << 1 | 1] >= qv) res = Query(lson, qv);else res = Query(rson, qv);push_up(o);return res;}
} T;int Num[N], n, a[N], Size[N], fa[N];
int ans[N], cnt[N];int main() {cin >> n >> k;For (i, 1, n) a[i] = read();sort(a + 1, a + 1 + n);reverse(a + 1, a + 1 + n);Fordown (i, n - 1, 1) if (a[i] == a[i + 1]) cnt[i] = cnt[i + 1] + 1;Fordown (i, n, 1) {++ Size[i];Size[fa[i] = floor(i / k)] += Size[i];}T.Build(1, 1, n);For (i, 1, n) {if (fa[i] && fa[i] != fa[i - 1]) T.Update(1, 1, n, ans[fa[i]], n, -(Size[fa[i]] - 1));int res = T.Query(1, 1, n, Size[i]);res += cnt[res]; ++ cnt[res]; res -= (cnt[res] - 1); ans[i] = res;T.Update(1, 1, n, res, n, Size[i]);}For (i, 1, n) printf ("%d ", a[ans[i]]);return 0;
}

轉載于:https://www.cnblogs.com/zjp-shadow/p/8782872.html

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

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

相關文章

手眼標定

Eye-in-hand和Eye-to-hand問題求解和實驗 2018年12月07日 00:00:40 百川木易 閱讀數 3018 2018/12/5 By Yang Yang&#xff08;yangyangipp.ac.cn&#xff09; 本文所有源碼和仿真場景文件全部公開&#xff0c;點擊Gitee倉庫鏈接。 文章目錄 問題描述Eye-in-hand問題求解公式…

RNN總結

RNN既可以表述為循環神 經網絡&#xff08;recurrent neural network&#xff09;&#xff0c;也可以表述為遞歸神經網絡&#xff08;recursive neural network&#xff09;&#xff0c;前者一般用于處理以時間序列為輸入的問題&#xff08;比如把一個句子看成詞組成的序列&…

Problem 2. number題解

number&#xff1a;數學二分圖匹配 首先&#xff0c;如果S<N,那么S1&#xff0c;S2...N這些數直接放在S1,S2...N的位置上(如果其他數x放在這些位置上面&#xff0c;這些數不放在對應位置&#xff0c;那么x一定能放在這些數放的位置&#xff0c;所以直接交換即可)所以可以直接…

SSD列子

一、介紹 本博文主要介紹實現通過SSD物體檢測方式實現工件裂紋檢測。裂紋圖像如下所示&#xff1a; 二、關于SSD算法 具體算法不再闡述&#xff0c;詳細請參考&#xff1a; https://blog.csdn.net/u013989576/article/details/73439202 https://blog.csdn.net/xiaohu2022/arti…

linux硬鏈接與軟鏈接

Linux 系統中有軟鏈接和硬鏈接兩種特殊的“文件”。 軟鏈接可以看作是Windows中的快捷方式&#xff0c;可以讓你快速鏈接到目標檔案或目錄。 硬鏈接則透過文件系統的inode來產生新檔名&#xff0c;而不是產生新檔案。 創建方法都很簡單&#xff1a; 軟鏈接&#xff08;符號鏈接…

int轉時間

int轉時間 public static string FormatDuration(int duration) { if (duration 0) return "00:00:00"; int hours duration / 3600; int minutes duration % 3600 / 60; int seconds duration % 3600 % 60; string _hours hours.ToString("00") &qu…

企業級區塊鏈現狀研究報告:小企業的投資總額是大企業的28倍

根據企業級區塊鏈現狀研究報告表明&#xff0c;當前企業采用區塊鏈技術的勢頭正在逐步增強。參與該報告的企業表示&#xff0c;區塊鏈投資今年共增長了 62% &#xff0c;預計到 2025 年區塊鏈將成為主流技術。其中&#xff0c;有 28% 的企業正在積極開展區塊鏈發展計劃。現在看…

特征匹配

Python 使用Opencv實現圖像特征檢測與匹配 2018-06-13 11:36:58 Xy-Huang 閱讀數 19203更多 分類專欄&#xff1a; Python 人工智能 版權聲明&#xff1a;本文為博主原創文章&#xff0c;遵循 CC 4.0 BY-SA 版權協議&#xff0c;轉載請附上原文出處鏈接和本聲明。 本文鏈接…

bzoj 1015 并查集

代碼&#xff1a; //這題可以反著想&#xff0c;把要去掉的點倒著處理變成往圖中一個一個的加點&#xff0c;然后用并查集處理聯通快就好了。 #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const in…

頁面中切換echarts主題

要做的效果是&#xff1a;點擊下拉框切換echarts主題 下面是效果圖&#xff1a; 項目環境&#xff1a; vue ts es6 echarts(4.2.1) 步驟 安裝依賴&#xff0c; npm install echarts -S / yarn add echarts -S引入主題 參考鏈接選擇下拉框中的主題時&#xff0c;拿到圖表主題…

畫極線

OpenCV學習日記5 2017-05-27 10:44:35 1000sprites 閱讀數 2339更多 分類專欄&#xff1a; 計算機視覺 版權聲明&#xff1a;本文為博主原創文章&#xff0c;遵循 CC 4.0 BY-SA 版權協議&#xff0c;轉載請附上原文出處鏈接和本聲明。 本文鏈接&#xff1a;https://blog.cs…

Win10開啟Administrator超級管理員賬戶

方法1 1、在系統的開始菜單上&#xff0c;我們單擊鼠標右鍵&#xff0c;然后選擇計算機管理打開進入 2、打開的計算機管理窗口&#xff0c;點擊本地用戶和組中的用戶打開&#xff0c;然后點擊右側的Administrator賬戶&#xff0c;雙擊鼠標打開進入 3、打開的屬性窗口中&#xf…

Mysql異常問題排查與處理——mysql的DNS反向解析和客戶端網卡重啟

中午剛想趴一會&#xff0c;不料鍋從天降&#xff01;&#xff01;&#xff01;Mysql連不上了。。。。。。。 現象如下&#xff1a; 現象1&#xff1a;登錄mysql所在服務器&#xff0c;連接MySQL 成功&#xff1b; 現象2&#xff1a;通過客戶端遠程連接MySQL&#xff0c;返回失…

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

優化一覽圖 優化 筆者將優化分為了兩大類&#xff1a;軟優化和硬優化。軟優化一般是操作數據庫即可&#xff1b;而硬優化則是操作服務器硬件及參數設置。 1、軟優化 1&#xff09;查詢語句優化 首先我們可以用EXPLAIN或DESCRIBE(簡寫:DESC)命令分析一條查詢語句的執行信息。 例…

【讀書筆記】《深入淺出Webpack》

Webpack版本 分析版本為3.6.0 4.0為最近升級的版本&#xff0c;與之前版本變化較大&#xff0c;編譯輸出的文件與3.0版本會不一致&#xff0c;目前項目中使用的版本3.0版本&#xff0c;所以基于3.0版本進行分析學習。 Webpack構建流程 初始化&#xff1a;啟動構建&#xff0c;讀…

《JAVA與模式》之橋梁模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述橋梁&#xff08;Bridge&#xff09;模式的&#xff1a; 橋梁模式是對象的結構模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實現化(Implementation)脫耦&#xff0…

LABLEME UPDATE DAMOD

Labelme的改進——海量圖片的自動標注 深度學習一般需要對大量的圖片進行標注&#xff0c;但是手動標注耗時耗力&#xff0c;所以模仿labelme軟件的功能&#xff0c;使用程序對大批量的圖片進行自動標注&#xff0c;大大減少手動操作。下面介紹如何實現對大批量的圖片進行標…

Java基礎教程:面向對象編程[2]

Java基礎教程&#xff1a;面向對象編程[2] 內容大綱 訪問修飾符 四種訪問修飾符 Java中&#xff0c;可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限。 default (即缺省&#xff0c;什么也不寫&#xff09;: 在同一包內可見&#xff…

【javascript】異步編年史,從“純回調”到Promise

異步和分塊——程序的分塊執行 一開始學習javascript的時候&#xff0c; 我對異步的概念一臉懵逼&#xff0c; 因為當時百度了很多文章&#xff0c;但很多各種文章不負責任的把籠統的描述混雜在一起&#xff0c;讓我對這個 JS中的重要概念難以理解&#xff0c; “異步是非阻塞的…

Shell編程之if語法練習(LNMP)全過程

大家好&#xff0c;我是延凱&#xff0c;本人原來在CSDN寫作已經快一年了 都是相關Linux運維這方面的技術知識&#xff0c;現在搬到博客園也是我一直想的&#xff0c;本博客主要寫Python&#xff0c;docker&#xff0c;shell等偏向開發云計算等知識點&#xff0c;謝謝各位&…