nssl1254-A(林下风气)【树形dp】
生活随笔
收集整理的這篇文章主要介紹了
nssl1254-A(林下风气)【树形dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
求一棵樹上有多少個聯通塊的最大值和最小值差為k。
解題思路
其實直接用差<=k的減去差<k的就是等于k的答案。
然后枚舉一個點為最大值,然后只往小編號擴張就好了(不重)。
code
#include<cstdio> #include<cstring> #include<algorithm> #define N 4000 #define XJQ 19260817 #define ll long long using namespace std; struct node{ll to,next; }a[N*2]; ll ls[N],w[N],ans1,ans2,n,k,tot,x,y,in[N]; void addl(ll x,ll y)//加邊 {a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot; } ll dp(ll x,ll fa,ll root,ll W)//dp {ll rep=1;for(ll i=ls[x];i;i=a[i].next){int v=a[i].to;if(v==fa||w[a[i].to]>w[root]) continue;if(w[root]-w[v]>W) continue;if(v<root||w[v]<w[root])rep=(rep*(dp(v,x,root,W)+1)%XJQ)%XJQ;}return rep; } int main() {scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&w[i]);for(ll i=1;i<n;i++){scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}for(ll i=1;i<=n;i++){ans1=(ans1+dp(i,i,i,k))%XJQ;if(k) ans2=(ans2+dp(i,i,i,k-1))%XJQ;}printf("%lld",(ans1-ans2+XJQ)%XJQ); }總結
以上是生活随笔為你收集整理的nssl1254-A(林下风气)【树形dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享个简洁的系统清理工具分享个简洁的系统
- 下一篇: 房屋如何缴纳契税房产契税如何缴纳