貪心 倍增 構造

2022-09-21 03:36:11 字數 1783 閱讀 3673

倍增!倍增!倍增!

構造!構造!構造!

cf1516d cut

乙個長度為 \(n\) 的序列,每次詢問 \([l, r]\) 最少劃分成多少段使得每一段的乘積等於他們的 \(\operatorname\)。

不難發現題目給出的限制就是每一段的數兩兩互質,而且總是貪心地選擇最靠右的滿足條件的,所以乙個位置向右延伸的長度是固定的。

可以雙指標求出每個點向右延伸的長度,然後預處理倍增,每次詢問的時候從 \(l\) 開始跳就行了。

p3295 [scoi2016]萌萌噠

乙個長度為 \(n\) 的序列, \(m\) 個限制條件 \(l_1, r_1,l_2,r_2\),保證長度相同,意思為 \(s[l_1..r_1]\) 與 \(s[l_2..r_2]\) 相同, 求滿足所有條件的數。

暴力直接可以用乙個並查集維護,假設不同的連通塊有 \(k\) 個,則答案就是 \(9\times 10^\),這樣詢問是 \(o(n^2)\),而查詢只是 \(o(n)\) 的,這啟發我們平衡複雜度。

考慮倍增, 對於每個點維護 \([i,i+2^k-1]\) 的並查集,那麼查詢可以直接跳,那麼怎麼求答案呢 ?

以 \(k\) 從大往小合併並查集,若乙個點 \(x\) 它的根不是它自己的話, 就把 \(x\) 的左右兒子和根的左右兒子合併即可。

不錯的思路。

cf1175e minimal segment cover

給定 \(n\) 個線段 \([l_i,r_i]\),\(m\) 次詢問 \(x,y\),求至少選多少個線段使得它們的幷包含 \([x,y]\)。

首先對線段按右端點 \(r\) 排序, 去掉完全被包含的線段, 求出它的可以向右延伸的端點是 \(p\),倍增計算。跟第乙個題差不多。

p1084 [noip2012 提高組] 疫情控制

一棵樹, 邊有邊權,有 \(m\) 個軍隊最開始在點 \(p_i\) ,每乙個軍隊可以移動到一棵非根的子樹上把這棵子樹封鎖, 消耗的時間為走過的邊權和, \(m\) 個軍隊可以同時移動, 求最少的時間封鎖所有葉子節點。

首先二分答案, 看是否能在 \(\leq x\) 的時間內完成, 我們考慮如下貪心策略 :

1.若乙個點可以走到根,先讓它走到根,並把它們剩餘時間從小到大排序。

2.若不能, 因為越往上的點能封鎖的點是越多的,直接把這個點提到它所能走到的最上端的點。

那麼此時已經有一些點被封鎖。如果對於乙個點, 在根方向的那個父親沒有被封鎖的話, 那麼還是讓它回去封鎖它的父親。

再把所有 1 的所有未封鎖的兒子按邊權從小到大排序,與剩餘的點一一匹配,若能匹配完則有解。

需要注意的是當乙個點的所有子樹都被封鎖後這個點也被封鎖了。 細節多多多多。

cf1251e2 voting (hard version)

一共有 \(n\) 個選民,你可以付出 \(p_i\) 的代價讓第 \(i\) 個選民為你投票,或者,在為你投票的人數達到 \(m_i\) 時,他會主動為你投票而不用你付出任何代價。

問得到所有選民投票的最小代價。

神仙貪心題。

首先這種最小代價肯定要對於一維排序,不妨以 \(m_i\) 降序排序, 在考慮一段相同的 \(m\) 時, 我們可以認為 \(m_i > m\) 的 \(i\) 已經被說服了,其中有 \(cnt\) 個人是花費代價購買的,小於 \(m\) 的個數有 \(k\) 個, 那麼總的花費錢的個數是 \(cnt+k\),若 \(cnt + k \geq m\),則這些點都可以免費選。

否則我們把這些點加入小根堆裡面, 每次貪心的找出最小的 \(p_i\) 累加答案即可。

at4502 [agc029c] lexicographic constraints

JZOJ6096 森林 倍增 貪心

n 200000 這道題專門坑那些資料結構學傻的老年選手 比如我 先考慮如何變換能得到最大的答案。容易發現我們的最終答案一定形如左圖,像右圖那樣選兩段不相交的一定是不優的。更進一步,我們可以發現左邊的三叉中的兩叉一定構成了原樹的直徑 有可能往上叉 我們對於每一次加入新點,判斷能否換掉直徑的乙個端點,...

L Lexicography 貪心,構造

題目大意 給個字串,平均分成n份,每個子段長l個字元,求字典序最小的第k小子段。思路 對於前k 1個子段,一旦在某一位大於了第k個子段的相同位,那就標記這個子段,後序貪心給他大的字元。否則為了,維護前k 1個子段大於第k個並且第k個要盡可能小,只能取剩餘字元中小的。然後用multiset搞一搞輸出就...

Social Distance(貪心 構造)

傳送門 很有意思的一道題 因此,問題就可以歸結到如何構造上了 那麼該如何構造呢?由於資料很大,結合經驗基本可以確定是o n 的時間複雜度,因此就要思考如何處理才能使得操作具有o n 的時間複雜度 先用乙個優先佇列 小根堆 存入每個值為1的點,這樣所有為1的點就按照順序排列了,還有一點非常重要的是 如...