zoukankan      html  css  js  c++  java
  • GCD Counting Codeforces

    https://www.luogu.org/problemnew/show/CF990G

    耶,又一道好题被我浪费掉了,不会做。。

    显然可以反演,在这之前只需对于每个i,统计出有多少(x,y),满足x到y简单路径上所有点权值都是i的倍数即可

    方法1:

    可以发现,对于给定的i,这样的“权值是i的倍数”的点一定可以构成一些连通块,每个连通块内部的点两两符合条件,且不会出现跨连通块的合法点对

    自己的做法:

    那么,搞2*10^5个动态开点的并查集,对于每条边(u,v),枚举所有a[u]和a[v]的公因子i(可以预处理出1-200000的所有因子),在第i个并查集中合并u和v所在的集合,顺便统计答案

    多麻烦啊。。。而且码量大复杂度n*log^2*sqrt(因子sqrt;线段树维护动态开点数组,因此并查集查询一次log^2)常数大空间还大。。A不掉的。。

    别人的做法:

    枚举每个i,找到所有边(u,v)满足gcd(a[u],a[v])是i的倍数的(可以开一堆vector来搞),用带撤销并查集合并,每个i搞完后撤销这次的所有修改

    枚举i+找的复杂度是n*log;操作的复杂度是均摊的,每条边因子sqrt个因此被枚举到sqrt次,每被枚举到一次需要一次log的合并,复杂度n*sqrt*log(好吧还是很不科学,但是显然非常的不满;毕竟这个因子个数虽然说是根号,但200000以内最多也就160个因子)

    貌似以上做法还A不掉?可以在并查集进行修改的时候记录一下这次修改进行的"时间",访问到fa[i]时查询一下这个值是否是当前时间的,如果不是就重置一下fa[i]再返回访问的答案,这样就可以路径压缩+按秩合并把log换成反阿克曼函数

    听说仍然A不掉?好像有人加了奇怪的剪枝过了的?然而这已经是正解复杂度了

    方法2:

    路径统计看上去可以点分,这个点分可以直接容斥,比较方便

    统计出当前点分中心到当前连通块内所有点的路径gcd,将所有这些值放入一个数组,那么问题就变成从数组中任取两个数取gcd来统计贡献

    暴力枚举每一个数的所有因子统计贡献

    其实由于所有这些数都gcd了一次当前点分中心权值,因此所有这些数的公因子最多只有sqrt个,枚举统计贡献即可

    每个连通块复杂度size*sqrt+sqrt,总复杂度大概n*log*sqrt(sqrt仍然是因子个数,不满)

  • 相关阅读:
    Linux环境下为普通用户添加sudo权限
    【转】在 Ubuntu 中使用 NTP 进行时间同步
    Shell脚本:批量添加用户,并设置随机字符为密码
    【转】Linux目录结构和常用命令
    系统启动流程
    linux系统利用libudev获取USB设备的VID和PID
    cJSON详解
    ajax读取文件内容
    window.location网页URL信息
    html实现网站全局按钮点击后置灰,不允许连续点击
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9368609.html
Copyright © 2011-2022 走看看