jzoj5888
tj:暴力連邊會tle
我們發現所有邊的邊權最大值不超過100000,這意味著可以設計和邊權有關的算法,假設現在邊權不相同
枚舉一個現在的邊權i,代表gcd為i,設連的2個點權值為a1∗ia1*ia1∗i和a2∗ia2*ia2∗i,當且僅當a1與a2互質時,gcd值為i
這樣子可以將a1∗ia1*ia1∗i和a2∗ia2*ia2∗i連起來,但是還是太慢
我們可以考慮將所有邊由i連向2∗i2*i2∗i,3∗i3*i3∗i…,得到的新圖與原圖等價
因為我們這一輪只能在2∗i2*i2∗i,3∗i3*i3∗i…中連邊,而以前我們只會連接a1與a2互質的邊,由於i的前面一項為1,與2,3,…互質,所以之前連的邊現在還會連,並且會使iii,2∗i2*i2∗i,3∗i3*i3∗i…聯通
這樣子我們得到了一個邊數為(max(a[i])lnmax(a[i]))(max(a[i])lnmax(a[i]))(max(a[i])lnmax(a[i]))的新圖。貪心連邊,從max(a[i])循環至1即可
注意,我們需要判權值相等的點,這些點沒有考慮到,需要全部加上這些點的權值
代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[2000010],p[2000010],mn,bk[2000010];
ll find(ll x){return p[x]==x?x:p[x]=find(p[x]);}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
scanf("%lld",&n);
ll ans=0;
for(ll i=1;i<=n;i++){
p[i]=i;
scanf("%lld",&a[i]);
if(!bk[a[i]])bk[a[i]]=i;
else ans+=a[i];
mn=max(mn,a[i]);
}
for(ll i=mn;i>=1;i--){
ll las=0;
for(ll j=1;j*i<=mn;j++)if(bk[j*i]){
ll xx=find(bk[j*i]);
if(!las)las=xx;
else{
if(las==xx)continue;
ans+=i;
p[xx]=las;
}
}
}
printf("%lld\n",ans);
}
jzoj5888的更多相关文章
- [JZOJ5888]GCD生成树
[JZOJ5888]GCD生成树 题目链接 gugugu 分析 对于N很小的情况,暴力Prim即可 对于值域很小的情况,我的想法与solution不太一样,将值相同的缩成一个点,\(O(w^2)\)预 ...
- NOIP前的刷题记录
因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...
随机推荐
- java 错误: 找不到或无法加载主类
这个问题应该很常见的,笔者经常手工编译一些测试代码或者小工具,经常用到 javac和java来编译并运行一些简单的小工具. 以Hello World来测试. HelloWorld.java publi ...
- Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解
所有异常类型都是 Throwable 类的子类,它包含Exception类和Error类,Exception又包括checked exception和unchecked exception. unch ...
- datatables分页
一万条以下 var dataTables = $('#dataTables').DataTable(); 一万条以上 var dataTables = $('#dataTables').DataTab ...
- php调用window系统自带的命令,比如计算器
1.在cmd命令行输入calc.exe 2.
- mysq 日期l查询
pym=mysql(host = '#', port = 3306, user = '#',passworld='#',database='#') #根据起始和结束时间 charge_sql = 'S ...
- vs 2015 运行安卓报错
vs2015 start Android 错误信息如下: Severity Code Description Project File Line Suppression StateError java ...
- MySQL之练习题5
.将所有的课程的名称以及对应的任课老师姓名打印出来,如下: SELECT cname,tname FROM course INNER JOIN teacher WHERE course.teacher ...
- 51Nod 1376 最长递增子序列的数量 (DP+BIT)
题意:略. 析:dp[i] 表示以第 i 个数结尾的LIS的长度和数量,状态方程很好转移,先说长度 dp[i] = max { dp[j] + 1 | a[i] > a[j] && ...
- 删除重复的feature vba VS 删除重复的feature python
VBA: Sub deleteDuplicatedFeature() Dim app As IApplication Set app = Application Dim pMxDocument As ...
- PRId64的正确用法
#include <inttypes.h> #include <stdint.h> #include <stdio.h> // g++ -g -o x x.cpp ...