zoukankan      html  css  js  c++  java
  • [Comet OJ

    传送门


    一开始读错题了,以为是(sum_{1leq uleq vleq n}f(u,v)),还疑惑这题这么简单怎么没人做(

    实际上是(sum_{1leq uleq vleq n}f(u,v)^{f(u,v)})(捂脸)

    这个东西拆分是几乎不可做的,因此只能直接算。

    发现对于固定起点的一条链,在链上做前缀( ext{and})运算时只会使某些位的(1)变为(0),因此可能的( ext{and})取值只有不超过(log a)种。即,对于确定根的某个子树,以根为一端的链( ext{and})值最多只有(dlog a)种,其中(d)为子树叶子个数。

    直接dfs即可,每个点维护子树中以其为一端的链( ext{and})值的种类和出现次数的集合。每次合并两棵子树时,暴力枚举两个集合中所有值计算。发现两个叶子只有在lca处才会产生(log^2a)的复杂度,即合并叶子的总复杂度不超过(d^2log^2a)。又由于路径最多(n^2)条,(ndleq 3 imes 10^6)就变成很强的性质了,(O(min(n,dlog a)^2)leq O(ndlog a)),在(d)(frac{n}{log a})时取到等号。

    然而(color{grey}{ ext{swk}})太菜了,犯了两个错误,都会导致复杂度上升至(O(ndlog^2 a))

    • 维护子树中以其为一端的链( ext{and})值的种类和出现次数的集合时,每次合并一棵子树要对值的种类去重。(color{grey}{ ext{swk}})采用了暴力排序后去重的方法。然而正解是直接将两个vector拼接在一起,只在交接处去重。可以发现这样做不会使复杂度上界上升。

    • 题面中的模数是有深意的,给出原根的目的是通过预处理离散对数来避免快速幂。然而(color{grey}{ ext{swk}})没注意到这点,就直接暴力快速幂了QAQ

    然而所幸的是这两只(log a)都属于常数较小的一类,加之数据很难做到卡满,(color{grey}{ ext{swk}})仍然完成了(2999ms)通过时限(3s)的题目的壮举(逃

  • 相关阅读:
    spring-boot-mybatis-plus-layui 自定义代码生成完整多对一
    spring-boot-jap-layui-mysql 完整的jpa多对一
    IDEA 2020.1 热部署(JRebel)
    IDEA 2020.1 隐藏文件和文件夹
    IDEA 2020.1 修改代码字体和界面字体
    IDEA 2020.1 创建springboot项目(国内脚手架)安装lombok
    tensorflow2.0
    cuda资料收集
    视觉学习资料整理
    std::move and std::forward
  • 原文地址:https://www.cnblogs.com/suwakow/p/11419656.html
Copyright © 2011-2022 走看看