BZOJ4585 Apio2016 煙火表演

2021-07-27 04:46:53 字數 2410 閱讀 1858

烟花表演是最引人注目的節日活動之一。在表演中,所有的烟花必須同時**。為了確保安

全,烟花被安置在遠離開關的位置上,通過一些導火索與開關相連。導火索的連線方式形成

一棵樹,烟花是樹葉,如[圖1]所示。火花從開關出發,沿導火索移動。每當火花抵達乙個分

叉點時,它會擴散到與之相連的所有導火索,繼續燃燒。導火索燃燒的速度是乙個固定常

數。[圖1]展示了六枚烟花的連線布局,以及每根導火索的長度。圖中還標

注了當在時刻 從開關點燃火花時,每一發烟花的**時間。

hyunmin為烟花表演設計了導火索的連線布局。不幸的是,在他設計的布局中,烟花不一定

同時**。我們希望修改一些導火索的長度,讓所有烟花在同一時刻**。例如,為了讓[圖

1]中的所有烟花在時刻 13**,我們可以像[圖2]中左邊那樣調整導火索長度。類似地,為

了讓[圖1]中的所有烟花在時刻 14**,我們可以像[圖2]中右邊那樣調整長度。

修改導火索長度的代價等於修改前後長度之差的絕對值。例如,將[圖1]中布局修改為[圖2]

左邊布局的總代價為6 ,而將[圖1]中布局修改為[圖2]右邊布局的總代價為 5.

導火索的長度可以被減為0 ,同時保持連通性不變。

給定乙個導火索的連線布局,你需要編寫乙個程式,去調整導火索長度,讓所有的烟花在同

一時刻**,並使得代價最小。

所有的輸入均為正整數。令 n代表分叉點的數量, m代表烟花的數量。分叉點從1 到n 編

號,編號為1 的分叉點是開關。烟花從n+1 到 n+m編號。1<=n+m<=300,000

輸入格式如下:

n m p

2 c2

p 3 c

3 ... p

n cn

p n+1 c

n+1... p

n+m c

n+m其中pi 滿足 1<=pi度( 1<=ci<=10^9)。除開關外,每個分叉點和多於1 條導火索相連,而每發烟花恰好與 1條導

火索相連。

輸出調整導火索長度,讓所有烟花同時**,所需要的最小代價

4 61 5

2 52 8

3 33 2

3 32 9

4 44 3

5可並堆

考慮乙個點f(x)表示將這個點子樹所有葉節點深度變成x的最小代價

發現是個下凸函式,並且是線性的

對於乙個點,假設f(x=[l,r])取得最小值

考慮加上到父親的邊權w

if(x<=l) f(x)=f(x)+w

if(l

if(l+w

if(x>r+w) f(x)=f(l)+x-r-w

發現實際上是把第一段向上平移,中間加入斜率為-1,0,1的直線

把多個合併起來,右邊的斜率最大值就是其度數

那麼我們考慮它到父親貢獻時,把斜率為正的點都pop掉

然後暴力新增拐點即可,每次只會加2個

合併就直接用可並堆了,我寫的左偏樹

最後取出1這個點的最小值時,我們是這樣計算的

把斜率》=0的都pop掉,提取1-l的所有點

f(0)=∑樹邊權,然後斜率每次-1直到0

那麼從右往左減就可以了

sum-=p[i]可以理解為把p[i]的斜率=-1的貢獻算進去,然後前面所有直線斜率-=1

#include using namespace std;

const int maxn = 600060;

struct node

e[maxn];

long long p[maxn], sum;

int n, m, tot, fa[maxn], len[maxn], rt[maxn], d[maxn], cnt;

inline int merge(int x, int y)

inline int pop(int x)

int main()

for( int i = n + m ; i > 1 ; i-- )

e[ ++tot ].v = l + len[ i ];

e[ ++tot ].v = r + len[ i ];

rt[ i ] = merge( rt[ i ], merge( tot, tot - 1 ) );

rt[ fa[ i ] ] = merge( rt[ fa[ i ] ], rt[ i ] );

} while( d[ 1 ]-- ) rt[ 1 ] = pop( rt[ 1 ] );

while( rt[ 1 ] ) p[ ++cnt ] = e[ rt[ 1 ] ].v, rt[ 1 ] = pop( rt[ 1 ] );

for( int i = 1 ; i <= cnt ; i++ )

sum -= p[ i ];

cout << sum << endl;

return 0;

}

bzoj4070 APIO2015 耶加達的摩天樓

time limit 10 sec memory limit 256 mb submit 189 solved 70 submit status discuss 印尼首都耶加達市有 n 座摩天樓,它們排列成一條直線,我們從左到右依次將它們編號為 0 到 n 1。除了這 n 座摩天樓外,耶加達市沒有其...

bzoj 3624 Apio2008 免費道路

這題一看,不是一句話題意,不想做。題意就不說了吧。首先想到的肯定是最小生成樹。然後我就想起了以前的某道題。好吧,記不大清了。我一開始的想法是貪心替換。就是先把圖構好,然後用0去換1 也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。然後隨手給自己的替代方法舉...

BZOJ 1911 APIO2010 特別行動隊

題目描述 因為是從別人部落格裡斜率優化分類一欄找的題目,所以 這題被我秒了。顯然先預處理字首和s i ik 1 xi 設 d i 為將前i 個士兵分組的最大修正後戰鬥力。d i max maxm ax a s i 2 b s i c設 kixj biyj 2a s i s j d i a s i 2...