首页 > 其他分享 >UOJ #33 树上 GCD

UOJ #33 树上 GCD

时间:2024-01-29 10:22:24浏览次数:22  
标签:cnt GCD limits 33 复杂度 sqrt mathcal UOJ 单层

套路地,对每个 \(g \in [1, n - 1]\) 求出有多少对无序对 \((u, v)\) 满足 \(g|f(u, v)\),然后就可以用一个倒序枚举的 \(\mathcal O(n \log n)\) 的容斥求出答案。

考虑点分治,对每个经过分治中心 \(c\) 的 \(u \rightsquigarrow \text{lca}(u, v) \rightsquigarrow v\) 只需分两种情况讨论(为了方便表述,记 \(\mathcal T_u\) 表示以 \(u\) 为根的子树):

  • \(u, v \in \mathcal T_c\)

    此时显然 \(\text{lca}(u, v) = c\),开个桶做一下就好。

    具体地,维护 \(cnt_i = \sum\limits_{u \in \mathcal T_c}[d(c, u) = i], c_i = \sum\limits_{i | j}cnt_j\),然后合并的时候枚举 \(g\) 统计贡献即可,单层时间复杂度是 \(\mathcal O(n \log n)\)。

  • \(u, v\) 一个在 \(\mathcal T_c\) 内,一个在 \(\mathcal T_c\) 外(可以钦定此时 \(u \in \mathcal T_c, v \notin \mathcal T_c\))

    同样是维护 \(cnt_i = \sum\limits_{u \in \mathcal T_c}[d(c, u) = i]\),然后对从分治中心到当前子树的根节点路径上的点维护一个同样的桶 \(cnt'\),合并时枚举 \(g\),还要做在 \(cnt\) 上查询某个下标间隔为 \(g\) 的子序列和,记忆化一下就能做到单层 \(\mathcal O(n \sqrt n)\)。

    关于时间复杂度的计算:记 \(H = \max\limits_{u \in \mathcal T_c}d(c, u)\)。对 \(g > \sqrt H\),单次查询时间复杂度 \(\mathcal O(\sqrt H)\);对 \(g \le \sqrt H\),最劣(也就是完全没用到记忆化的规模最大)的情况下是对每个 \(g\) 恰好查询所有 \(g\) 个不同的子序列和,时间复杂度 \(\mathcal O(H \sqrt H)\),查询次数 \(\mathcal O(H)\),均摊时间复杂度 \(\mathcal O(\sqrt H)\)。总查询次数是 \(\mathcal O(n)\) 的,故时间复杂度为 \(\mathcal O(n \sqrt H)\),也即单层 \(\mathcal O(n \sqrt n)\)。如果仔细算了时间复杂度,自然会发现常数非常小。

然后我们知道了单层时间复杂度是 \(\mathcal O(n \sqrt n)\),点分治的时间复杂度是 \(\mathcal O(n \log n)\),根据主定理,取大的单层时间复杂度,总体时间复杂度是 \(\mathcal O(n \sqrt n)\)。

代码:


标签:cnt,GCD,limits,33,复杂度,sqrt,mathcal,UOJ,单层
From: https://www.cnblogs.com/chy12321/p/17993938

相关文章

  • CF337E Divisor Tree
    题意简述定义DivisorTree为一棵树:叶子上的数为质数。非叶子上的数为其所有儿子上的数的乘积。给定\(n\)个数\(a_i\),你需要让每个\(a_i\)都在DivisorTree上出现,并最小化DivisorTree的节点数量。\(n\le8,a_i\le10^6\)。分析显然DivisorTree上只能有质数......
  • AtCoder Beginner Contest 338
    A-Capitalized?#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;usingi32=int32_t;usingpii=pair<int,int>;constintinf=1e9,INF=1e18;i32main(){strings;cin>>......
  • ABC338D 题解
    赛时怎么连这题都不会。再不练练思维真的就连普及题都不会做了啊。Solution题目来源:ABC338D(inAtcoder|in洛谷)。不妨先考虑应该断掉哪条边。首先我们发现,仅断掉一条边并不会让两个结点不可达,只会让我们从一个结点绕更远的路到达目标结点。如果我们要从结点\(u\)前往结点......
  • Mysql数据库更新RedHat/CentOS 从 8.0.14 到 8.0.33,又从8.0.33更新到8.0.35
    sudosystemctlstartmysqldFirstlyweneedbackupalldatabasedataintonewfile,IuseTestPortal.sql/data/VMs_Share/Homes/bell-bash-4.2$mysqldump-uroot-p--databasesTestPortal>TestPortal.sqlEnterpassword:-bash-4.2$2.downloadtheve......
  • ABC338 F Negative Traveling Salesman 题解
    QuestionABC338FNegativeTravelingSalesman给出一个\(N\)个点\(M\)条边的有向图,边权可能为负数,但不可能有负环每经过一条边就要加上这条边的代价求,一条路径经过所有的点,并且要求总代价最小Solution观察到\(N\le20\)自然而然想到状压因为多次经过一条边的代价是......
  • AtCoder Beginner Contest 338
    基本情况A忘记大小写敏感卡了20分钟,BC秒了,E用树状数组草过去了,D错了25个点,似乎是交界没有判断好。B-FrequencyB-Frequency(atcoder.jp)这题还可以更优雅点。intmain(){strings;cin>>s;map<char,int>cnt;for(inti=0;i<s.size();i++......
  • AtCoder Beginner Contest 338
    基本情况:A和B直接秒了,C题没写出来大致是思路的问题,下面就讲一下C自己的思路和题解C-LeftoverRecipes题目概述,先输入一个数字代表有多少中配料,然后依次输入A菜每种配料所需的量,然后输入B菜每种配料所需的量,最后输出最多可以做多少盘菜样例:280030010010020010输出为......
  • ABC338 D Island Tour 题解
    Question有\(n\)座海岛由\(n\)条桥连着,第\(i\)座桥连接第\(i\)和\(i+1\)座海岛,第\(n\)座桥连接第\(n\)和\(1\)座海盗有一条长度为\(m\)的旅游路线,第\(X_i\)表示依次到达的岛屿现在需要切断一条桥,求总旅游路线最小值Solution显然,从第\(X_{i-1}\)到\(X_......
  • ABC338 E Chords 题解
    Question一个圆上有\(2N\)个点均匀分布,给出\(N\)条线,每条线连接两个顶点问,有没有两条线相交Solution也算一个比较典的题目考虑到这种两两配对,配对中有没有交错关系的可以考虑异或哈希因为一个数异或两次等于它本身,所以我们可以用异或来实现一个“撤销”操作我们当我......
  • ABC338 题解(A-E)
    前言:F,G后续补充。A题意判断一个字符串,是否满足只有第一位为大写字母,其余为小写字母。Sol字面意思模拟即可。Code#include<bits/stdc++.h>#definelllonglong#defineN200005#defineendl"\n"#definefifirst#definesesecondusingnamespacestd;constll......