• 「考试」省选55


    T1
    好可恶的憨憨题。。
    大体上是一个思路转化。
    我们把求被覆盖的方案数转化为求总方案数和不被覆盖的方案数。
    我们知道最多有(nlogn)个区间的(gcd)是不同的。
    我们把这些极长区间求出来。
    按照左端点找右端点和右端点找左端点分别求两次。
    会得到一个三元组((L,r1,r2),(R,l1,l2))
    然后我们枚举(gcd)以及其包含的三元组。
    那么设(f[i])为右端点为([1,i])的合法方案数,(g[i])([i,n])为左端点的合法方案数。
    那么答案的(i)的位置的贡献上就要加上(f[i-1]g[i+1])表示不包含这个点的方案数。
    考虑用线段树和三元组区间优化转移。
    那么以(f)为例子。
    有:

    [forall iin[R,n],f[i]+=sumlimits_{j=l1}^{l2}f[j-1] ]

    这样用线段树转移一下就可以了。
    然后我们发现假设我们把端点(L,R)离散化,那么一段区间中的所有点的(f[i-1],g[i+1])全都是相同的,我们可以用一个差分来搞这个东西。
    总方案数的算法就是直接把(f[n])累加起来就可以了。
    最终用总方案数-贡献即可算出正确答案。

    T2
    博弈论结论题。
    其实我们把一个点到根的某条树链抽开来分析的话。
    他和翻硬币游戏挺像的。
    翻硬币游戏是说
    一行硬币,最终要求全部都翻到反面,每次可以选择一个正面为右端点,然后反转一段区间中的所有硬币。
    这个翻硬币游戏是可以把正面的分开来考虑的。
    这个题模型和翻硬币很相似,我们也可以抽离开每一个白色的点分别作为一个游戏考虑。
    然后莫名其妙的打表发现(SG((i,j))=lowbit(max(i,j)))
    (SG)定理得到一个总的游戏的(SG)值为多个分游戏的(SG)的值。
    就是要求所有矩形并中所有节点的(lowbit(max(i,j)))
    那么我们可以做扫描线。
    枚举一下(i),然后分别求([i+1,mx])(lowbit(j))(xor)和。
    以及([0,i])的节点个数的奇偶性。
    然后我们建树的时候建出来(xin[l,r])这样一个节点。
    这个节点如果全部被覆盖的话,那么其答案一定是(((r-l+1)/2)^lowbit(l))
    那么就可以扫描线硬来了。

    T3
    定义:
    (g[x])(x)及其子树的拓扑序个数。
    (f[x][t][i])(t)(x)的子树拓扑序中的排名为倒数第(i)位的方案数。
    (dp[x])(x)及其子树的各种拓扑序形成的逆序对个数。
    (fr(x,S))(x)去掉(S)中的所有儿子的子树后的拓扑序个数。
    (se(x,t1,t2))(x)(t1)儿子和(t2)儿子中的点形成的逆序对方案。
    设某个点有(k)个儿子。

    首先考虑(g)(dp)
    有转移:

    [g[x]=sz[x]!prodlimits_{i=1}^{k}frac{g[ch[x][i]]}{(sz[ch[x][i]])!} ]

    这样相当于是一个可重集合排列+内部定序。
    然后又有:

    [fr(x,S)=left(sumlimits_{i=1}^{k}[ch[x][i] otin S]sz[ch[x][i]] ight)!prodlimits_{i=1}^{k}frac{g[ch[x][i]]}{sz[ch[x][i]]!} ]

    设祖先关系必然存在的逆序对个数为(ct)
    那么祖孙关系得到的必然贡献就是:(ctg[1])
    然后考虑偶然贡献,也就是兄弟子树之间的贡献。
    首先考虑(f)数组的转移。
    (c)(x)的一个儿子,其中(t)(c)子树中的某一个点。
    设:(S=sz[x]-1-sz[c])
    那么有:

    [f[x][t][i]=fr(x,c)sumlimits_{j=0}^{min(sz[t],i)}f[c][t][j]inom{i-1}{j-1}inom{sz[c]+S-i}{sz[c]-j} ]

    枚举两个儿子(t1,t2)
    考虑计算(se(x,t1,t2))
    枚举两个点(a,b),使得(ain t1,bin t2)
    我们考虑如何计算(se(x,t1,t2))

    [se(x,t1,t2)=sumlimits_{ain T1}sumlimits_{bin T2}[a<b]sumlimits_{i=1}^{sz[t1]+sz[t2]}sumlimits_{j=1}^{sz[t1]}f[t1][a][j]inom{i-1}{j-1}inom{sz[t1]-j+sz[t2]-(i-j)}{sz[t1]-j}sumlimits_{k=1}^{i-j}f[t2][b][k] ]

    后面的那个东西可以直接搞一个前缀和来做。
    这样相当于是在枚举(a,b)(t1),(t2)中的排名以及(a)(x)中有多少个(t2)中的点比(a)靠前。
    第二个枚举可以用前缀和优化掉。
    然后我们考虑去统计以(x)(lca)的逆序对贡献和。

    [dp[x]=sumlimits_{i=1}^{k}sumlimits_{j=1}^{k}fr(x,ch[x][i],ch[x][j])se(x,ch[x][i],ch[x][j])inom{sz[x]-1}{sz[ch[x][i]]+sz[ch[x][j]]}+sumlimits_{i=1}^{k}dp[ch[x][i]]fr(ch[x][i])inom{sz[x]-1}{sz[ch[x][i]]} ]

    那么有:

    [ans=g[1]ct+dp[1] ]

  • 相关阅读:
    Selenium开发环境搭建
    如何抓取移动端崩溃日志?
    html+ashx + NPOI 实现导出Excel文件并且预览和下载
    oss 文件上传:Web端上传介绍
    事务控制和锁定语句
    索引的设计和使用
    最近几年读过的书籍
    053.NET5_EFCoreMigration
    052.NET5_EFCoreDbFirst
    051.NET5_中间件的多种引用方式
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12576264.html
Copyright © 2020-2023  润新知