请问sz这样加为什么不对,而改称真正的子树sz就对了呢?
查看原帖
请问sz这样加为什么不对,而改称真正的子树sz就对了呢?
525375
Richard_Whr楼主2024/1/7 22:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1667,mod=64123;
vector<int> e[N];
int f[N][N];
int g[N],val[N];
int w[N];
int sz[N];
int n,m,maxv;
void add(int a,int b)
{
    e[a].push_back(b);
}

void dfs(int u,int fa)
{
    int sum=sz[u];
    for(auto v:e[u])
    {
        if(v==fa) continue;
        dfs(v,u);
        sum+=sz[v];
    }
    for(int j=0;j<=sum;j++) f[u][j]=0;

    f[u][sz[u]]=1;
    for(auto v:e[u])
    {
        if(v==fa) continue;
        for(int j=0;j<=sz[u]+sz[v];j++) g[j]=0;
        for(int j=sz[u];j>=0;j--)
        {
            if(!f[u][j]) continue;
            (g[j]+=f[u][j])%=mod;
            for(int k=0;k<=sz[v];k++)
            {
                if(!f[v][k]) continue;
                (g[j+k]+=f[u][j]*f[v][k]%mod)%=mod;
            }
        }
        sz[u]+=sz[v];
        for(int j=0;j<=sz[u];j++) f[u][j]=g[j];
    }
}

signed main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    
    cin>>n>>m>>maxv;
    for(int i=1;i<=n;i++) cin>>w[i];

    for(int i=2,a,b;i<=n;i++)
    {
        cin>>a>>b;
        add(a,b),add(b,a);
    }

    int res=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) 
        {
            if((w[j]>w[i])||(w[j]==w[i]&&j>=i)) sz[j]=1;
            else sz[j]=0;
        }
        
        dfs(i,0);
        (res+=f[i][m]*w[i]%mod)%=mod;
    }

    cout<<res<<"\n";

    return 0;
}
2024/1/7 22:54
加载中...