jzoj5913 林下風氣 樹形dp

2021-08-29 09:56:00 字數 1454 閱讀 5381

裡口福因有林下風氣,帶領全國各地高校掀起了一股ak風,大家都十分痴迷於ak。裡口福為了打擊大家的自信心,出了一道自以為十分困難的題目。

裡口福有一棵樹,第i個節點上有點權ai,他的問題就是這棵樹中有多少個不同的連通塊滿足連通塊的最大值與最小值之差=k,兩個連通塊不同當且僅當至少存在乙個節點在乙個連通塊中出現而另乙個連通塊中沒有出現。

痴迷於ak的你馬上接下這道題目,在裡口福狂妄的笑聲中,你切掉這道題的決心更加堅定了,現在就差你的**了。

一行乙個整數,表示答案,答案對19260817取模。

對於30%的資料,n<=22

對於另外20%的資料,樹是一條鏈

對於另外20%的資料,ai只有0和1兩種

對於100%的資料,n<=3333,0<=ai<=n,k>=0

題面真是exciting

乙個套路是我們可以統計<=k的答案和<=k-1的答案,它們的差就是恰好=k的答案

考慮列舉最大點作為根,令f[i]表示節點i所在子樹內必選i形成連通塊的方案數,轉移顯然就是fi=

∏(fj

+1)(

j∈so

ni

)f_i=\prod \left(f_j+1\right) \left(j\in son_i\right)

fi​=∏(

fj​+

1)(j

∈son

i​)注意到這樣對於權值相同的節點可能會算重,因此我們欽定權值相同的節點必須由編號小的作為根

然後就做完了

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

typedef

long

long ll;

const

int mod=

19260817

;const

int n=

20005

;struct edge e[n*2]

;int ls[n]

,edcnt;

int v[n]

,k;inline

intread()

void

add_edge

(int x,

int y)

; ls[x]

=edcnt;

e[++edcnt]

=(edge)

; ls[y]

=edcnt;

}ll solve

(int now,

int fa,

int root)

}return ret;

}int

main

(void

)printf

("%lld\n"

,(ans1-ans2+mod)

%mod)

;return0;

}

591 標籤驗證器

給定乙個表示 片段的字串,你需要實現乙個驗證器來解析這段 並返回它是否合法。合法的 片段需要遵守以下的所有規則 必須被合法的閉合標籤包圍。否則,是無效的。閉合標籤 不一定合法 要嚴格符合格式 tag content。其中,是起始標籤,是結束標籤。起始和結束標籤中的 tag name 應當相同。當且僅...

591acm 動態規劃

題意簡述 需要購買n件物品,從m件商品中按順序進行選擇,求出從m件商品中購買到所需的n件物品最低消費,如果購不齊輸出impossible n 0 n 100 m 0 m 100。例1 2 3 1 2 2 0.05 1 10.00 1 3.00 impossible 例2 2 3 1 2 1 10.0...

Qt5 9 1 qmake中文手冊(一)

qmake工具有助於簡化跨平台專案的開發.它自動生成makefiles,只需要很少的資訊就可以建立makefiles。無論是qt專案或者是其他軟體專案,都可以使用qmake。qmake通過專案檔案 pro 裡提供的資訊自動生成makefiles.專案檔案 pro 由開發者建立,通常專案檔案 pro ...