TriCk

· · 个人记录

转化成对应前缀和的一段折线考虑。(/bx @Iceturky)

维护前后缀乘积(/bx @Iceturky)

求出 inv_i\times i \equiv 1\pmod p,考虑计算 p=ri+t,t<i,则 ri\equiv -t,i\equiv-\frac tr,inv_i\equiv -\frac rt\pmod p,所以 inv_i=(p-\lfloor\frac pi\rfloor)inv_{p\bmod i}\bmod p

使用可持久化值域线段树维护哈希值,从而快速求出最长公共前后缀,进行比较和更新。

当树上每个连通块作为根计算答案时,可用每个点为根计算一遍并累加,再减去以所有边连接的两个点合成大点作为个根的答案,这样每个连通块的贡献只有 1

当凸包的横纵坐标均为 [0,n] 内的整数时,凸包的点数为 O(n^{\frac23})

竞赛图强连通缩点后的 DAG 呈链状, 前面的所有点向后面的所有点连边;

竞赛图存在哈密顿回路和哈密顿路径。

多次询问时可预处理转移矩阵的 2^k 次方,每次询问做 \log n 次向量乘矩阵,复杂度为 O(k^3\log n+qk^2\log n)

若要最小化排列 p 的字典序,可考虑其逆排列 qp_{q_i}=i,q_{p_i}=i),并求出倒序字典序最大的 q,再还原回 p 即为答案。

证明考虑首先最小化 p_1,也就是 q1 的位置,以此类推。则 q 从后往前考虑,只能填 1 时再填 1,以此类推。

实在困难,记一下。代码选自 P11210。

int getp(int u,int l,int r,int L)
{
    if(r<L) return n+1;
    if(l>=L)
    {
        if(wy[u]<L) return n+1;
        if(l==r) return l;
    }
    int rl=getp(Lc,L);
    return rl==n+1?getp(Rc,L):rl;
}

每次随机选一个左部未匹配点 x(可初始随机一个排列),再随机其连着的某点 y 求增广路,期望复杂度 \mathcal O(n\ln n)

二分图最大匹配数与最小点覆盖数相等,最大独立集为最小点覆盖的补集。

构造一组最小点覆盖,可在最大匹配 M 的基础上,找到所有左部未匹配点通过交错路不可达的左部点和可达的右部点,即为一组最小点覆盖。在最大匹配的网络流图上即残量网络中 S 不可达的左部点和可达的右部点。