【問題描述】
π姐最近生了個漂亮寶寶休假在家,聽lee姐介紹經驗時發覺lee姐比高中反應遲鈍了些,一問才知lee姐是因為連生了兩兒子才這樣的,lee姐的體會是一孕笨三年,π姐聽了覺得閒著也是閒著,得找些挑戰的事情做做,於是π姐最近開始刷起了高數題,她遇到了這樣一道高數題。這道高數題裡面有一棵n個點的樹,樹上每個點有點權,每條邊有顏色。一條路徑的權值是這條路徑上所有點的點權和,一條合法的路徑需要滿足該路徑上任意相鄰的兩條邊顏色都不相同。問這棵樹上所有合法路徑的權值和是多少啊?(無向路徑)
【輸入格式】
第一行乙個整數n,代表樹上有多少個點。
接下來一行n個整數,代表樹上每個點的權值。
接下來n-1行,每行三個整數s、e、c,代表s與e之間有一條顏色為c的邊。
【輸出格式】
一行乙個整數,代表所求的值。
【輸入樣例】
66 2 3 7 1 4
1 2 1
1 3 2
1 4 3
2 5 1
2 6 2
【輸出樣例】
134【樣例解釋】
1-2 value: 8
1-3 value: 9
1-4 value:13
1-2-6 value:12
2-1-3 value:11
2-1-4 value:15
2-5 value:3
2-6 value:6
3-1-4 value:16
3-1-2-6 value:15
4-1-2-6 value:19
5-2-6 value:7
【資料規模】
對與30%的資料,1≤n≤1000。
對於另外20%的資料,可用的顏色數不超過109且隨機資料。
對於另外20%的資料,樹的形態為一條鏈。
對於100%的資料,1≤n≤3*105,可用的顏色數不超過109,所有點權的大小不超過105。
題解:這道題看上去很簡單它也的確很簡單
記錄乙個sum陣列
p a[
i]表示
以i為終
點的路徑
總數
pa[i]表示以i為終點的路徑總數
pa[i]表
示以i為
終點的路
徑總數sum
[i]表
示以i為
終點的所
有路徑的
權值
和sum[i]表示以i為終點的所有路徑的權值和
sum[i]
表示以i
為終點的
所有路徑
的權值和
(從葉子往跟做,前提是相鄰的邊的顏色要不一樣)
這個是處理能往上走的路徑方案
然後不能往上走的也就是說以這個節點為中轉站的
就是這個節點所有子節點
p a[
i]∗s
um[j
]+pa
[j]∗
sum[
i]+p
a[i]
∗pa[
j]∗w
[x
]pa[i]*sum[j]+pa[j]*sum[i]+pa[i]*pa[j]*w[x]
pa[i]∗
sum[
j]+p
a[j]
∗sum
[i]+
pa[i
]∗pa
[j]∗
w[x]
i ,j
,x
i,j,x
i,j,
x分別表示這個節點的任意兩個子節點以及該子節點
因為每條新路徑他們都要加一次,所以如上公式
結束!
#include
using
namespace std;
const
int maxm=
300010
;long
long ans=0;
struct node
e[maxm<<1]
;long
long cnt,head[maxm]
,w[maxm]
,pa[maxm]
,n;long
long sum[maxm]
,sump[maxm]
;void
add(
int u,
int v,
int color)
void
dfs(
int x,
int fa,
int fr)
else ans+
=sum[y]
+w[x]
*pa[y];}
for(
int i=head[x]
; i; i=e[i]
.nxt)
for(
int j=e[i]
.nxt; j; j=e[j]
.nxt)
if(i!=j&&e[i]
.color!=e[j]
.color&&e[i]
.v!=fa&&e[j]
.v!=fa)
ans-
=w[x]
; sum[x]
+=w[x]
; pa[x]++;
}int
main()
dfs(1,
1,-1
);for(
int i=
1; i<=n; i++
) ans+
=sum[i]
;printf
("%lld"
,ans)
;}
注意一些細節,long long之類的
初測0,原因是第二個公式的有乙個j
jj打成了i
ii,然後還過了樣例沒發現,還有是記錄父親連線爺爺的邊的顏色
e [i
].co
lo
re[i].color
e[i].c
olor
打成了i
ii,居然夠了樣例,然後時間沒來的及造資料
難過qwq
樹形DP 高階題
emmmm我之前那篇部落格都是一些普及提高的樹形dp水題,基本都是乙個模板能夠解決的問題。現在讓我們來高階一下。傳送門 有乙個樹形結構,每條邊的長度相同,任意兩個節點可以相互到達。選3個點。兩兩距離相等。有多少種方案?難度 省選 noi 這道題的難度並不是不能接受,一開始會覺得很難但是仔細想過之後會...
樹形dp 沒有上司的舞會 模板題 樹形dp
樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於 關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。285.沒有上司的舞會 簡單模擬樣例,便於理解 樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點 樹形dp思路 重點 狀壓dp 思路 狀態轉...
樹形DP 樹形DP四例
是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...