題目描述 題解
題目可以轉化一下,就是要在原樹中選出 k+1
k+1k+
1 條不相交的鏈使得其權值和最大。
考慮暴力 dp
\text
dp : f[u
][i]
[0/1
/2
]f[u][i][0/1/2]
f[u][i
][0/
1/2]
表示 u
uu 子樹選了 i
ii 條鏈, u
uu 沒有連邊/有一條出邊/有兩條出邊的最大值,可惜是 o(n
k2
)o(nk^2)
o(nk2)
的過不去。
稍微感性理解一下,如果設選出 x
xx 的答案為 f(x
)f(x)
f(x)
的話,那應該是個上凸殼,所以可以採用 wqs
\text
wqs 二分把第二維消掉,具體來說就是選每條鏈的時候就 −mi
d-mid
−mid
,然後記錄一下取最大值的時候選了多少條鏈即可。效率 o(n
logc
)o(nlogc)
o(nlog
c)**
#include
#define ll long long
using
namespace std;
const
int n=
3e5+
5,m=n<<1;
const ll f=
-2e18
;ll c;
int n,k,hd[n]
,v[m]
,w[m]
,nx[m]
,t;struct oa,f[n][3
],g[3]
;bool
operator
<
(o a,o b)
o operator
+(o a,o b);}
void
add(
int u,
int v,
int w)
void
dfs(
int u,
int fr)
;f[u][1
]=(o);f[u][2
]=(o);
for(
int v,i=hd[u]
;i;i=nx[i]))
; f[u][2
]=max(f[u][2
],g[2]
+ax)
; f[u][2
]=max(f[u][2
],g[1]
+f[v][1
]+(o));}
}int
main()
c=l;
dfs(1,
0); cout<<
max(f[1]
[0],
max(f[1]
[1],f[1]
[2])
).x+c*k
}
洛谷4382 八省聯考2018 劈配
省選滾粗回家。滿懷信心的day2t1網路流。乙個半小時自信過樣例。然後就回家了。首先能很快的看出這是乙個網路流。第一問 我們考慮匹配,按順序列舉人,再按順序列舉優先順序,每次在前乙個優先順序的殘餘網路上加邊,跑最大流,若流量是1,則說明這是他的理論可能的最高優先順序,去做下乙個人,否則繼續列舉優先順...
洛谷4364 九省聯考2018 IIIDX
標籤 線段樹 題目傳送門 osu 聽過沒?那是konano 最喜歡的一款 遊戲,而他的夢想就是有一天自己也能做個獨特酷炫的 遊戲。現在,他在世界知名遊戲公司konmai 內工作,離他的夢想也越來越近了。這款 遊戲內一般都包含了許多歌曲,歌曲越多,玩家越不易玩膩。同時,為了使玩家在遊戲上氪更多的金錢花...
P4382 八省聯考 2018 劈配
題面自己看吧 std對於第一問,容易想到是二分圖匹配。具體模型 對於第二問,可以列舉這個學生要前進多少名。假設當前學生 i 前進 x 名。那麼把學生 i 的可以使他不沮喪的所有志願的所有邊連上。再把前 i x 1 名學生滿足第一問中的志願的邊連上。判斷是否滿流即可。總結 動態加邊網路流。includ...