• BZOJ4013 : [HNOI2015]实验比较


    首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树。

    设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP。

    对于当前点$x$,依次遍历它的所有儿子$y$,设以$x$为根的子树里之前已经有了$s[x]$个点,$y$子树里有$s[y]$个点,那么枚举之前部分里数字种类数$A$,$y$子树里数字种类数$B$,以及合并后用等号连接的数字个数$C$,有$f'[x][A+B-C]+=f[x][A] imes f[y][B] imes C_A^C imes C_{A+B-C}^A$。

    因为一对点只会在lca处被DP到,所以时间复杂度为$O(n^3)$。

    #include<cstdio>
    const int N=110,P=1000000007;
    int n,m,i,j,x,y,c[N][N],fa[N],f[N];
    int g[N],v[N],nxt[N],ed,dp[N][N],tmp[N],s[N],vis[N],ans;
    int d[N],h,t,q[N];
    char op[5];
    inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;d[y]++;}
    int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
    void dfs(int x){
      vis[x]=dp[x][0]=1;
      for(int i=g[x];i;i=nxt[i])if(!vis[v[i]]){
        int y=v[i];
        dfs(y);
        for(int A=0;A<=s[x]+s[y];A++)tmp[A]=0;
        for(int A=0;A<=s[x];A++)for(int B=1;B<=s[y];B++)for(int C=0;C<=A&&C<=B;C++)if(A+B>C)
          tmp[A+B-C]=(1LL*dp[x][A]*dp[y][B]%P*c[A][C]%P*c[A+B-C][A]+tmp[A+B-C])%P;
        s[x]+=s[y];
        for(int A=0;A<=s[x];A++)dp[x][A]=tmp[A];
      }
      s[x]++;
      for(int A=s[x];A;A--)dp[x][A]=dp[x][A-1];
      dp[x][0]=0;
    }
    int main(){
      scanf("%d%d",&n,&m);
      for(c[0][0]=i=1;i<=n;i++)for(c[i][0]=c[i][i]=j=1;j<i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%P;
      for(i=1;i<=n;i++)fa[i]=i;
      while(m--){
        scanf("%d%s%d",&x,op,&y);
        if(op[0]=='='){
          if(F(x)==F(y))continue;
          fa[fa[x]]=fa[y];
        }else f[y]=x;
      }
      for(i=1;i<=n;i++)fa[i]=F(i);
      for(i=1;i<=n;i++)if(f[i])add(fa[f[i]],fa[i]);
      for(i=1;i<=n;i++)if(!d[i]&&fa[i]==i)add(0,i);
      for(h=1,i=0;i<=n;i++)if(!d[i])q[++t]=i;
      while(h<=t)for(i=g[q[h++]];i;i=nxt[i])if(!(--d[v[i]]))q[++t]=v[i];
      if(t<=n)return puts("0"),0;
      for(dfs(0),i=2;i<=s[0];i++)ans=(ans+dp[0][i])%P;
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    实践出真知关于ios项目重命名的实践 (xcode 4.3.1) ,以及svn 导出项目命令
    解决error: linker command failed with exit code 1类似的错误
    关于对ios 目录路径的理解
    UITableView 隔行换色 选中背景色 取消选中颜色 返回后显示正常颜色
    NSLog的常用格式说明小释
    app打包总结 以及 提交app审核过程
    UIView圆角
    substringToIndex substringFromIndex
    ios 判断文字高度,适用于tableview的自定义高度
    [转]android解析XML总结
  • 原文地址:https://www.cnblogs.com/clrs97/p/5011681.html
Copyright © 2020-2023  润新知