GCD Counting Codeforces - 990G
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的更多相关文章
- Educational Codeforces Round 45 (Rated for Div. 2) G - GCD Counting
G - GCD Counting 思路:我猜测了一下gcd的个数不会很多,然后我就用dfs回溯的时候用map暴力合并就好啦. 终判被卡了MLE..... 需要每次清空一下子树的map... #inc ...
- CF1101D GCD Counting
题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...
- CF EDU 1101D GCD Counting 树形DP + 质因子分解
CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...
- CodeForces - 990G GCD Counting
Discription You are given a tree consisting of nn vertices. A number is written on each vertex; the ...
- CodeForces - 1101D:GCD Counting (树分治)
You are given a tree consisting of n vertices. A number is written on each vertex; the number on ver ...
- cf 990G - GCD Counting
题意 #include<bits/stdc++.h> #define t 200000 #define MAXN 200100 using namespace std; int n; in ...
- D. GCD Counting(树上dp)
题目链接:http://codeforces.com/contest/1101/problem/D 题目大意:给你n个点,每个点都有权值,然后给你边的关系,问你树上的最大距离.(这里的最大距离指的是这 ...
- [gcd,灵感] Codeforces 1200C Round Corridor
题目:https://codeforces.com/contest/1200/problem/C C. Round Corridor time limit per test 1 second memo ...
- Mike and gcd problem CodeForces - 798C (贪心思维+数论)
题目链接 比较棒的一道题, 题意: 给你一个N个数的数组,让你用尽量少的操作使整个数组的gcd大于1,即gcd(a1 ,a2,,,,an) > 1 如果可以输出YES和最小的次数,否则输出NO ...
随机推荐
- vs2010 msvcr100.DLL 丢失!!! 用release 就可以了
- android 编程小技巧(持续中)
first: Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- lonlifeOJ1152 “玲珑杯”ACM比赛 Round #19 概率DP
E -- Expected value of the expression DESCRIPTION You are given an expression: A0O1A1O2A2⋯OnAnA0O1A1 ...
- 【bzoj1433】[ZJOI2009]假期的宿舍
按要求连边,跑匈牙利 #include<algorithm> #include<iostream> #include<cstdlib> #include<cs ...
- JavaScript实现Map、Reduce和Filter
1. [代码][JavaScript]代码 <script type="text/javascript">// 函数式编程:// 描述我们要做什么,而不是我们如 ...
- ss连接不上
突然ss就连接不上了,而vps的ip能ping通,ssh也能登录. 折腾了半天都没解决. 后来解决了,关键点有两个 (1)更改ss的服务端口,原本是9000,随便改为其他的: (2)在switch里设 ...
- 【CQ18阶梯赛第8场】题解
[A:HDU2032 杨辉三角]: 简单的递推,或者是基础的DP: 但是只有杨润东一个人1A,整体准确率只有8/37,具体原因不详. 经验:提交前一定要试一下比较特殊的数据或者最大的数据.其次,为了保 ...
- 理解Objective-C Runtime (五)协议与分类
Objective-C中的分类允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到. Objective-C中的协议是普遍存在的 ...
- 【NOIP 2003】 加分二叉树
[题目链接] 点击打开链接 [算法] 树形DP即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 50 in ...