1 条题解

  • 0
    @ 2022-6-5 10:29:46

    luogu

    #include"cstdio"
    #include"cstring"
    #include"iostream"
    #include"algorithm"
    using namespace std;
    
    const int MAXN=1005;
    const int MOD=1e9;
    
    int n,np,maxn,root;
    int fa[MAXN],h[MAXN];
    int f[3][MAXN];
    struct rpg{
    	int li,nx;
    }a[MAXN];
    struct Big{
    	long long v[25];
    	
    	void reset(){memset(v,0,sizeof(v));v[0]=1;}
    	void write(){printf("%lld",v[v[0]]);for(int i=v[0]-1;i;--i) printf("%09lld",v[i]);puts("");}
    	void pls(Big a,Big b){
    		reset();
    		v[0]=max(a.v[0],b.v[0])+1;
    		for(int i=1;i<=v[0];++i){
    			v[i]+=a.v[i]+b.v[i];
    			if(v[i]>=MOD) v[i]-=MOD,++v[i+1];
    		}if(!v[v[0]]&&v[0]>1) --v[0];
    		return;
    	}
    	
    	void mul(Big a,Big b){
    		reset();
    		v[0]=a.v[0]+b.v[0];
    		for(int i=1;i<=a.v[0];++i){
    			for(int j=1;j<=b.v[0];++j){
    				v[i+j-1]+=a.v[i]*b.v[j];
    				if(v[i+j-1]>=MOD) v[i+j]+=v[i+j-1]/MOD,v[i+j-1]%=MOD;
    			}
    		}while(!v[v[0]]&&v[0]>1) --v[0];
    		return;
    	}
    }cnt[3][MAXN],ans;
    
    void add(int ls,int nx){a[++np]=(rpg){h[ls],nx};h[ls]=np;}
    void dfs(int x)
    {
    	f[1][x]=(bool)fa[x];
    	for(int i=0;i<3;++i) cnt[i][x].reset();
    	cnt[1][x].v[1]=cnt[2][x].v[1]=1;
    	if(h[x]) cnt[0][x].v[1]=1;
    	Big cl,ct;cl.reset();cl.v[1]=1;
    	for(int i=h[x];i;i=a[i].li){
    		dfs(a[i].nx);
    		if(f[0][a[i].nx]==f[2][a[i].nx]) ct.pls(cnt[0][a[i].nx],cnt[2][a[i].nx]),cl.mul(cl,ct);
    		if(f[0][a[i].nx]>f[2][a[i].nx]) cl.mul(cl,cnt[0][a[i].nx]);
    		if(f[0][a[i].nx]<f[2][a[i].nx]) cl.mul(cl,cnt[2][a[i].nx]);
    		f[1][x]+=max(f[0][a[i].nx],f[2][a[i].nx]);
    		f[2][x]+=max(f[0][a[i].nx],f[2][a[i].nx]);
    	}cnt[1][x]=cnt[2][x]=cl;
    	for(int i=h[x];i;i=a[i].li){
    		int mx=f[1][a[i].nx];
    		Big clc=cnt[1][a[i].nx];
    		for(int j=h[x];j;j=a[j].li){
    			if(a[j].nx==a[i].nx) continue;
    			if(f[0][a[j].nx]==f[2][a[j].nx]) ct.pls(cnt[0][a[j].nx],cnt[2][a[j].nx]),clc.mul(clc,ct);
    			if(f[0][a[j].nx]>f[2][a[j].nx]) clc.mul(clc,cnt[0][a[j].nx]);
    			if(f[0][a[j].nx]<f[2][a[j].nx]) clc.mul(clc,cnt[2][a[j].nx]);
    			mx+=max(f[0][a[j].nx],f[2][a[j].nx]);
    		}if(f[0][x]<mx) f[0][x]=mx,cnt[0][x]=clc;
    		else if(f[0][x]==mx) cnt[0][x].pls(cnt[0][x],clc);
    	}return;
    }
    
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		int x,m;scanf("%d%d",&x,&m);
    		while(m--){int y;scanf("%d",&y);fa[y]=x;add(x,y);}
    	}for(int i=1;i<=n;++i) if(!fa[i]) root=i;
    	dfs(root);maxn=max(f[0][root],f[2][root]);
    	if(f[0][root]>f[2][root]) ans=cnt[0][root];
    	if(f[0][root]==f[2][root]) ans.pls(cnt[0][root],cnt[2][root]);
    	if(f[0][root]<f[2][root]) ans=cnt[2][root];
    	printf("%d\n",maxn);ans.write();
    	return 0;///test
    }
    
    • 1

    信息

    ID
    618
    时间
    500ms
    内存
    32MiB
    难度
    6
    标签
    递交数
    2
    已通过
    2
    上传者