码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P4365 [九省联考2018]秘密袭击coat

时间:2019-09-07 17:16:34      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:namespace   ==   efi   memset   line   ext   +=   代码   sig   

luogu

这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和

把比这个点大的点看成\(1\),小于等于他的看成\(0\),那么就是要求出包含枚举的那个点并且权值和为\(k-1\)的联通块个数,可以树型\(dp\),设\(f_{x,j}\)表示联通块最上面的点为\(x\)并且权值和为\(j\)的联通块数,转移树型背包即可,具体细节见代码.复杂度可以做到\(O(nk)\)

所以总复杂度为\(O(n^2k)\) ×

所以总复杂度为\(O(\text{能过})\)

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double

using namespace std;
const int N=1666+10,mod=64123;
int rd()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
int to[N<<1],nt[N<<1],hd[N],tot=1;
void add(int x,int y)
{
    ++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
    ++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot;
}
int n,kk,w,rt,a[N],p[N],rk[N],sz[N],f[N][N],g[N];
bool cmp(int aa,int bb){return a[aa]>a[bb];}
void dp(int x,int ffa)
{
    int va=rk[x]<rk[rt];
    sz[x]=va;
    f[x][va]=1;
    for(int i=hd[x];i;i=nt[i])
    {
        if(i==ffa) continue;
        int y=to[i];
        dp(y,i^1);
        ad(f[y][0],1);
        for(int j=0;j<=sz[x];++j)
            for(int k=0;k<=sz[y]&&j+k<=kk;++k)
                ad(g[j+k],1ll*f[x][j]*f[y][k]%mod);
        sz[x]=min(sz[x]+sz[y],kk);
        for(int j=0;j<=sz[x];++j)
            f[x][j]=g[j],g[j]=0;
    }
}

int main()
{
    n=rd(),kk=rd(),w=rd();
    for(int i=1;i<=n;++i) a[i]=rd(),p[i]=i;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;++i) rk[p[i]]=i;
    for(int i=1;i<n;++i) add(rd(),rd());
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        rt=i;
        dp(i,0);
        ad(ans,1ll*a[i]*f[i][kk-1]%mod);
        for(int j=1;j<=n;++j)
            memset(f[j],0,sizeof(int)*(sz[j]+1));
    }
    printf("%d\n",ans);
    return 0;
}

luogu P4365 [九省联考2018]秘密袭击coat

标签:namespace   ==   efi   memset   line   ext   +=   代码   sig   

原文地址:https://www.cnblogs.com/smyjr/p/11481826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!