求助,为什么会TLE
查看原帖
求助,为什么会TLE
300710
xuyuansu楼主2022/12/19 10:13

我的写法应该是可以过的,但是最后三个点T了,提交记录里和我做法类似的最后三个点只用了500ms左右,但是我T了。

#include<bits/stdc++.h>
using namespace std;
const int N=20,M=(1<<20);
typedef long long ll;
int n,m,s,xs[M];
int mod=998244353,d[N],k[N],b[N],deg[N],ks[N],bs[N];
int f[M];
int head[N],ver[N*2],ne[N*2],tot;
inline int read()
{
	int ret=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
inline int ksm(int x,int y)
{
    int res=1;
    while(y)
    {
        if(y&1) res=1ll*res*x%mod;
        x=1ll*x*x%mod;y>>=1;
    }
    return res;
}
inline void add(int x,int y)
{
    ver[++tot]=y;ne[tot]=head[x];head[x]=tot;
}
void dfs(int x,int fa,int S)
{
    bool ok=((S>>(x-1))&1);
    k[x]=b[x]=ks[x]=bs[x]=0;
    for(int i=head[x];i;i=ne[i])
    {
        int y=ver[i];
        if(y==fa) continue;
        dfs(y,x,S);
        if(!ok) ks[x]=(ks[x]+k[y])%mod,bs[x]=(bs[x]+b[y])%mod;
    }
    if(!ok)
    {
        k[x]=ksm((deg[x]-ks[x]+mod)%mod,mod-2);
        b[x]=1ll*(deg[x]+bs[x])*k[x]%mod;
    }
}
int main()
{
    n=read(),m=read(),s=read();
    for(int i=1;i<n;i++)
    {
        int x=read(),y=read();
        add(x,y);add(y,x);
        deg[x]++;deg[y]++;
    }
    xs[0]=-1;
    for(int i=1;i<(1<<n);i++)
    {
        xs[i]=xs[i>>1]*((i&1) ? -1 : 1);
        dfs(s,0,i);
        f[i]=b[s]*xs[i];
    }
    for(int i=0;i<n;i++)
        for(int j=1;j<(1<<n);j++)
            if(j&(1<<i)) f[j]=(f[j^(1<<i)]+f[j])%mod;
    for(int i=1;i<=m;i++)
    {
        int siz=read(),now=0;
        for(int j=1;j<=siz;j++)
        {
            int x=read();
            now|=(1<<(x-1));
        }
        printf("%d\n",(f[now]+mod)%mod);
    }
    return 0;
}
2022/12/19 10:13
加载中...