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仍然是因子个数,不满)

GCD Counting Codeforces - 990G的更多相关文章

  1. Educational Codeforces Round 45 (Rated for Div. 2) G - GCD Counting

    G - GCD Counting 思路:我猜测了一下gcd的个数不会很多,然后我就用dfs回溯的时候用map暴力合并就好啦. 终判被卡了MLE.....  需要每次清空一下子树的map... #inc ...

  2. CF1101D GCD Counting

    题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...

  3. CF EDU 1101D GCD Counting 树形DP + 质因子分解

    CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...

  4. CodeForces - 990G GCD Counting

    Discription You are given a tree consisting of nn vertices. A number is written on each vertex; the ...

  5. CodeForces - 1101D:GCD Counting (树分治)

    You are given a tree consisting of n vertices. A number is written on each vertex; the number on ver ...

  6. cf 990G - GCD Counting

    题意 #include<bits/stdc++.h> #define t 200000 #define MAXN 200100 using namespace std; int n; in ...

  7. D. GCD Counting(树上dp)

    题目链接:http://codeforces.com/contest/1101/problem/D 题目大意:给你n个点,每个点都有权值,然后给你边的关系,问你树上的最大距离.(这里的最大距离指的是这 ...

  8. [gcd,灵感] Codeforces 1200C Round Corridor

    题目:https://codeforces.com/contest/1200/problem/C C. Round Corridor time limit per test 1 second memo ...

  9. Mike and gcd problem CodeForces - 798C (贪心思维+数论)

    题目链接 比较棒的一道题, 题意: 给你一个N个数的数组,让你用尽量少的操作使整个数组的gcd大于1,即gcd(a1 ,a2,,,,an) > 1 如果可以输出YES和最小的次数,否则输出NO ...

随机推荐

  1. Linux input子系统实例分析(二)

    紧接着上一节的实例我们来分析调用的input子系统的接口: 1. input_dev,用来标识输入设备 1: struct input_dev { 2: const char *name; //设备名 ...

  2. 利用ctypes调用Fortran程序

    本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...

  3. Android 通过Application 传递数据

    </pre><pre> package com.example.ApplicationTest; import android.app.Application; /** * C ...

  4. 【iOS系列】-自定义Modar动画

    [iOS系列]-自定义Modar动画.md 我们需要做的最终的modar动画的效果是这样的, 就是点击cell,cell发生位移,慢慢的到第二个界面上的.为了做出这样的动画效果,我们需要以下的知识. ...

  5. 自制简单的range(Vue)

    废话不多说先上成果图 实现思路 主要分界面与逻辑两大块 界面分为5个部分 左滑块长度 左内容位置 中间长度 右滑块长度 右内容位置 逻辑 touch3个事件 各滑块长度及位置计算 选中时变色 具体实现 ...

  6. eclipse安装lombok和常用注解使用

    1.下载lombok.jar lombok 的官方网址:http://projectlombok.org/   2.运行lombok.jar: java -jar  D:\eclipse-luna\l ...

  7. Opencv与dlib联合进行人脸关键点检测与识别

    前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上.使用libfacedetection实现人脸区域检测,联合dlib标记 ...

  8. CodeForces-380C:Sereja and Brackets(线段树与括号序列)

    Sereja has a bracket sequence s1, s2, ..., sn, or, in other words, a string s of length n, consistin ...

  9. 【旧文章搬运】更正一个枚举PspCidTable时的错误

    原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...

  10. Struts2验证框架的配置及validation.xml常用的验证规则

    转自:https://blog.csdn.net/wenwenxiong/article/details/55802655