• ARC201E Total Area of Bounding Boxes

    相当于有 $n$ 个点 $(x_i,y_i)$,求


  • ARC199A Flip Row or Col 2

    先操作若干列使得第一行全部变成 $0$。


  • P12621 [NAC 2025] Circle of Leaf 题解

    记 $f_{i,j}$ 表示确定完 $i$ 子树内每条边的选取情况(包括叶子到根的边)后,有 $j$ 条路径能从 $i$ 走到叶子再走到根的方案数。


  • ARC201C Prefix Covering 题解

    如果把选择的字符串放到 trie 上,那么当且仅当选择的点能往上覆盖到根才能拼出所有字符串。
    换句话说,记 $f_u$ 表示以 $u$ 为前缀的任意字符串能否被拼出,那么


  • ARC197D 祖孙关系题解

    如果 $a_{x,y}=1$,那么 $x,y$ 具有祖先关系,我们发现儿子的所有祖先关系都被他祖先包括了,因此 $a_x a_y=a_x$ 或 $a_x a_y=a_y$。

  • 莫比乌斯函数重置版

    \[\mu(n)=\left\{ \begin{matrix} 1&n=1\\ 0&n 含有非平凡平方因子\\ (-1)^k&其中 k 为 n 本质不同的质因子个数 \end{matrix} \right.\]
  • 行列式——矩阵树与 LGV

    行列式


  • 虚树速通

    如果每次询问是输入树上一个点集,那么做法往往是虚树。
    虚树就是把原图中所有有用的点抠出来,然后把抠出来的点建颗树,叫虚树。
    那哪些点有用?b 中的点是输入的点(关键点),c 中的点是有用的点(为了可以树形 dp 不得不加入的点)。
    其实虚树就相当于把一棵树中两个关键点路径间的点压缩成了很少的几个点,把不在关键点路径上的都忽略掉了。

    int m;cin>>m;
    b.resize(m);
    for(int i=0;i<m;i++)cin>>b[i];
    std::sort(all(b),[](int x,int y){
    	return dfn[x]<dfn[y];
    });
    c=b;
    for(int i=1;i<m;i++)
    	c.push_back(LCA(b[i-1],b[i]));
    sort(all(c),[](int x,int y){
    	return dfn[x]<dfn[y];
    });
    c.erase(unique(all(c)),c.end());
    for(int i=1;i<siz(c);i++){
    	int j=LCA(c[i-1],c[i]),d=DIS(j,c[i]);
    	g2[j].emplace_back(c[i],d);
    	g2[c[i]].emplace_back(j,d);
    }
    

  • 从 tarjan 到圆方树

    强连通

    强连通分量:在一张有向图中,如果 $u$ 能走到 $v$,$v$ 能走到 $u$,那么 $u,v$ 在同一个强连通分量内。

    求强连通分量

    强连通分量缩点:将一张有向图中所有在同一个强连通分量内的点变成同一个点。缩点之后是拓扑图。


  • QOJ9243 Counting Multisets

    给定 $n,x,y_m$,对于每个 $y<y_m$,求有多少长度为 $n$ 的数组,满足它们加起来是 $x$,或起来是 $y$ 并且这个数组的排列个数是奇数个。