首页 > 其他分享 >[ZJOI2022] 树

[ZJOI2022] 树

时间:2024-02-21 22:15:57浏览次数:26  
标签:终点 个点 int 入边 ZJOI2022 考虑

[ZJOI2022] 树

一些经典的 dp 手法。

考虑这个题目在讲什么,每个点都要朝左右两边连各一条有向边,限制是一个点要么左边没有入边要么右边没有入边,但不能两边同时没有入边。

发现没法转化,考虑硬做。设 \(f_{i, j, k, l}\) 表示考虑前 \(i\) 个点,有 \(j\) 条向右的有向边终点待定,有 \(k\) 个点必须接受以后的向左的入边,\(l\) 个点可以接受而不必须接受。有朴素的 \(O(n^5)\) 的 dp。

发现后面两维很冗余,考虑怎么干掉这两维。发现关键在于维护必须和非必须,启发我们考虑容斥,必须接 = 随便接 - 不接。这样设 \(f_{i, j, k}\) 其中 \(k\) 表示有 \(k\) 个点是随便接不接的。代码如下:

f[1][1][1] = 1;
for(int i = 2; i <= n; ++i) {
  for(int j = 1; j < i; ++j) {
    for(int k = 0; k < i; ++k) if(f[i - 1][j][k]) {
      int w = 1ll * f[i - 1][j][k] * k % P;
      add(f[i][j + 1][k + 1], w);
      sub(f[i][j + 1][k], w);
      for(int l = 1; l <= j; ++l)
        add(f[i][j - l + 1][k], 1ll * binom[j][l] * w % P);
    }
  }
  for(int j = 0; j <= i; ++j)
    add(F[i], f[i][1][j]);
  cout << F[i] << '\n';
}

写完后发现这时候第二维转移是 \(O(n)\) 的,导致最终复杂度变成了 \(O(n^4)\)。考虑把这部分也优化掉。有一个经典手法,就是在每个点就钦定好向右连边的终点,我们只需维护目前需要多少个终点,支持新增一个终点即可。总复杂度 \(O(n^3)\)。

int main() {
  cin >> n >> P;
  f[1][1][1] = 1;
  for(int i = 2; i <= n; ++i) {
    int ans = 0;
    for(int j = 0; j <= n - i + 1; ++j)
      for(int k = 0; k < i; ++k) if(f[i - 1][j][k]) {
        int w = 1ll * f[i - 1][j][k] * k % P;
        add(f[i][j - 1][k], 1ll * w * (j - 1) % P);
        if(j == 1) add(ans, w);
        add(f[i][j][k], 1ll * w * j % P);
        add(f[i][j][k + 1], 1ll * w * j % P);
        add(f[i][j + 1][k + 1], 1ll * w * (j + 1) % P);
        sub(f[i][j][k], 1ll * w * j % P);
        sub(f[i][j + 1][k], 1ll * w * (j + 1) % P);
      }
    cout << ans << '\n';
  }
}

标签:终点,个点,int,入边,ZJOI2022,考虑
From: https://www.cnblogs.com/DCH233/p/18026302

相关文章

  • P8329 [ZJOI2022] 树
    直接求是困难的,所以考虑容斥将所求容斥为两部分:每个结点至少在一棵树上为叶子的方案数-至少有一个结点在两棵树上都为叶子的方案数。考虑DP,设\(f_i(x,y)\)表示\([1,i]\)中是第一棵树的非叶子的结点数为\(x\),\([i+1,n]\)中是第二棵树的非叶子的结点数为\(y\)时的......
  • P8330 [ZJOI2022] 众数 题解
    Description给定一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),问选一段区间,它的价值是里面的众数个数\(+\)外面的众数个数,求最大价值,以及所有满足这个最大价值的区间的外面的众数颜色。\(\sumn\leq5\times10^5,n\leq2\times10^5\)。Solution考虑根号分治。定义一个......
  • [ZJOI2022] 深搜 题解
    题目描述九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。有一天,可怜得到了一棵有根树,树根为\(\mathit{root}\),树上每个节点\(x\)有一个权值\(a_x\)。在一棵树上从\(x\)出发,寻找\(y\)节点,如果使用深度优先搜索,则可描述为以下演算过程:将递归栈......
  • [ZJOI2022] 树
    题目描述九条可怜是一个喜欢树的女孩子,她想生成两棵均有\(n\)个节点的树。第一棵树的生成方式是:节点\(1\)作为树的根。对于\(i\in[2,n]\),从\([1,i-1]\)......
  • 「ZJOI2022」众数
    「ZJOI2022」众数好难。题意:给定序列\(a\),选择一个连续子序列使得子序列内众数与剩下部分众数出现次数和最大,求出现次数和的最大值并给出剩下部分众数的可能情况。看到......
  • ZJOI2022 深搜
    链接:https://www.luogu.com.cn/problem/P8334题解:最小值期望显然可以转化为\(>=x\)的概率求和,所以我们可以考虑一个暴力,每次将\(>=x\)的点加入称为黑点,然后进行\(dp\)。那......