#CF1866C. 彻底搜索逆序对

彻底搜索逆序对

彻底搜索逆序对

  • 时间限制:2 秒
  • 内存限制:512 MiB

题目描述

给定一个有 NN 个顶点的有向无环图。顶点 ii 有 SiS_i 条出边;它的第 jj 条出边指向 Li,jL_{i,j},边权为 Wi,j∈{0,1}W_{i,j}\in\{0,1\}。保证从顶点 11 出发可以到达所有顶点。

初始有一个空数组 ZZ。定义函数:

void dfs(int i) {
    for (int j = 1; j <= S[i]; ++j) {
        Z.push_back(W[i][j]);
        dfs(L[i][j]);
    }
}

函数不会记录已经访问过的顶点,因此同一顶点可能被处理多次。

执行一次 $ exttt{dfs(1)}后, 后,Z$ 只包含 00 和 11。求 ZZ 的逆序对数量,即满足 x<yx<y 且 Zx>ZyZ_x>Z_y 的下标对 (x,y)(x,y) 数量。答案对 998244353998244353 取模。

输入格式

第一行包含整数 NN。

随后依次给出顶点 11 到 NN 的信息。顶点 ii 的第一行包含整数 SiS_i;接下来的 SiS_i 行,每行包含两个整数 Li,j,Wi,jL_{i,j},W_{i,j},按输入顺序描述第 jj 条出边。

图中没有重边和有向环;从顶点 11 可以到达所有顶点。

输出格式

输出 ZZ 的逆序对数量对 998244353998244353 取模后的结果。

样例输入 1

5
2
4 0
3 1
0
1
2 0
2
3 1
5 1
0

样例输出 1

4

样例说明

执行过程如下图所示:

DFS 执行过程

最终 Z=[0,1,0,1,1,0]Z=[0,1,0,1,1,0],四个逆序对是 (2,3),(2,6),(4,6),(5,6)(2,3),(2,6),(4,6),(5,6)。

数据范围

  • 2≤N≤1052\le N\le10^5;
  • 0≤Si≤N−10\le S_i\le N-1;
  • 1≤Li,j≤N1\le L_{i,j}\le N;
  • Wi,j∈{0,1}W_{i,j}\in\{0,1\};
  • ∑Si≤2×105\sum S_i\le2\times10^5。
子任务编号 分值 特殊限制
1 20 给定的图是一棵以顶点 11 为根的有向树
2 40 N≤20N\le20
3 无特殊限制