• 【BZOJ5250】【2018九省联考】—秘密袭击(树形dp)


    传送门

    据说正解要线段树合并+拉格朗日插值+生成函数

    我选择暴力艹标算

    暴力树上dp+剪枝就可以了
    f[i][j]f[i][j]表示以ii为根的子树,联通块有jj个点时的答案
    如果当前所有大于枚举到的ww的点都小于kk个那么再大也不行了
    可以直接breakbreak

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    inline int read(){
    	char ch=getchar();
    	int res=0,f=1;
    	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    	return res*f;
    }
    const int N=1805;
    const ll mod=64123;
    int n,cnt,k,num[N],w;
    int adj[N],nxt[N<<1],to[N<<1];
    ll d[N],f[N][N],ans;
    inline int add(ll a,ll b){
    	return (a+b>=mod)?(a+b-mod):(a+b);
    }
    inline int mul(ll a,ll b){
    	return ((a*b)>=mod)?(a*b%mod):(a*b);
    }
    inline void addedge(int u,int v){
    	nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;
    }
    void dfs(int u,int fa){
    	for(int i=0;i<=k;i++)f[u][i]=0;
    	f[u][num[u]]=1;
    	for(int e=adj[u];e;e=nxt[e]){
    		int v=to[e];if(v==fa)continue;
    		dfs(v,u);
    		for(int j=num[u];~j;j--){
    			ll p=f[u][j];
    			for(int l=num[v];~l;l--){
    				f[u][min(k,l+j)]=(f[u][min(k,l+j)]+p*f[v][l])%mod;
    			}
    		}
    		num[u]=min(num[u]+num[v],k);
    	}
    }
    int main(){
    	n=read(),k=read(),w=read();
    	for(int i=1;i<=n;i++)
    		d[i]=read();
    	for(int i=1;i<n;i++){
    		int u=read(),v=read();
    		addedge(u,v),addedge(v,u);
    	}
    	for(int i=1;i<=w;i++){
    		int tot=0;
    		for(int j=1;j<=n;j++){
    			tot+=(num[j]=d[j]>=i);
    		}
    		if(tot<k)break;
    		dfs(1,0);
    		for(int j=1;j<=n;j++){
    			ans=add(ans,f[j][k]);
    		}
    	}
    	cout<<ans%mod;
    }
    
  • 相关阅读:
    【题解】Image Perimeters-C++
    【题解】士兵训练-C++
    【题解】丑数Humble Numbers-C++
    【题解】P1638 逛画展-C++
    【题解】P3069 [USACO13JAN]牛的阵容Cow Lineup-C++
    【题解】[Noip2010]机器翻译-C++
    【题解】间隔排列-C++
    【极大化剪枝】Power Hungry Cows-C++【没有用A*!】【超级简单!】
    【题解】跳房子-C++
    C#高级编程第11版
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145647.html
Copyright © 2020-2023  润新知