烟花表演是最引人注目的節日活動之一。在表演中,所有的烟花必須同時**。為了確保安
全,烟花被安置在遠離開關的位置上,通過一些導火索與開關相連。導火索的連線方式形成
一棵樹,烟花是樹葉,如[圖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...