八省聯考 2018 林克卡特樹

2022-05-31 01:54:08 字數 1269 閱讀 5510

題意:求乙個凸函式的最優解。。。

思路:好吧在題意裡已經說出來了。

對於被卡斜率的,只能\(orz\)了。。。

其實據說還有\(12s\)評測這種操作,對不起我省\(5s\)。

好吧不廢話了,看看應該怎麼做。

暴力的話直接記\(dp[i][j][0->2]\)表示當前做到第 \(i\) 棵子樹用了$ j$ 條鏈並且當前點有\(0->2\)條出邊,轉移也好想。。。

正解的話。。。就是二分斜率。。

我們記\(f[i][0->2]\)表示做到$ i $子樹並且出邊是\(0->2\)個。

然後差分,發現單調凸性質,在函式上二分最優解即可。

#includeusing namespace std;

#define int long long

const int maxn = 600010;

inline int read()

while(isdigit(ch))

return q*f;

}struct node

}fp[maxn][3];

node dp[maxn];

node fg[3];

node tmp;

int n,m,k,q;

int cnt;

struct edge

e[maxn<<4];

int head[maxn];

inline void add(int u,int v,int w)

const int inf = 0x7fffffff;

inline void dfs(int x,int f)

tmp = dp[y];

for(int j = 0;j < 3; ++j)

fp[x][1].max(fg[0].x+fp[y][1].x+e[i].w,fg[0].y+fp[y][1].y);

fp[x][2].max(fg[1].x+fp[y][1].x+e[i].w+q,fg[1].y+fp[y][1].y-1);

} }dp[x]=fp[x][0];

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

return;

}int ans;

signed main()

int l=-inf,r=inf;

while(l <= r)

else l = q + 1;

} q = ans;

dfs(1,0);

cout

}

2018八省聯考 林克卡特樹

題目真滴皮 orz rqy 10分的暴力都沒拿到 10分直接求直徑 60分 容易?想到題目等價於求k 1條不相交的鏈 設狀態f i j 0 1 2 f i j 0 1 2 表示以第i個節點為根的子樹用了j條鏈並且根和兒子連有 0,1,2 條邊。轉移分為5類 g j cc 0 max g j cc 0...

八省聯考2018 林克卡特樹

挺簡單的一道題。原題斷k kk條邊連k kk條邊權為0 00的邊相當於尋去k 1 k 1k 1條不相交鏈出來,將它們連上得到的結果。所以我們要從原樹中選取k 1 k 1k 1條鏈出來,使得它們的權值和最大。我們發現恰好k 1 k 1k 1條鏈這個限制是比較難限制的,考慮通過凸優化二分去進行維護。由於...

八省聯考2018 林克卡特樹

題目描述 小l 最近沉迷於塞爾達傳說 荒野之息 the legend of zelda breath of the wild 無法自拔,他尤其喜歡遊戲中的迷你挑戰。遊戲中有乙個叫做 lct 的挑戰,它的規則是這樣子的 現在有乙個n 個點的 樹 tree 每條邊有乙個整數邊權vi 若vi 0,表示走這...