題意:求乙個凸函式的最優解。。。
思路:好吧在題意裡已經說出來了。
對於被卡斜率的,只能\(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,表示走這...