Build Roads
Build Roads
题意:
n个点,每个点的值为a[i],求最小生成树
a[i]是通过题目中给出的程序得到(即a[i]如何得到的我们并不需要很了解)
题解:
肯定不能直接跑最小生成树,因为数据太大了
银川也有个类似的题,比赛时我直接打表,发现当n很大时,答案就是n-1,通过我大量枚举,我得到结论,当n>1000时,我们就直接套结论,当小于1000时,就跑遍最小生成树
但是忘了一种情况,导致一直wa,题目给的L和R,表示的是a[i]的范围,如果L == R时(n很大),说明每个点的值都是L,那么gcd求出边长都是L,所以答案就是(n-1)*L
挺可惜,比赛时一直没想到最后这一小点
代码:
//蒟蒻三人行
#include<bits/stdc++.h>
#include<map>
#define random(a,b) ((a)+rand()%((b-a+1)))
typedef long long ll;
using namespace std;
const int maxn=1e7+9;
int n,L,R,a[200001];
int tot=0;
unsigned long long seed;
unsigned long long xorshift64()
{unsigned long long x=seed;x^=x<<13;x^=x>>7;x^=x<<17;return seed=x;
}
int gen(){return xorshift64()%(R-L+1)+L;
}
int gcd(int a,int b)
{if(b)return gcd(b,a%b);return a;
}
int fa[maxn];
struct node{int u,v,w;
}edge[maxn];
bool cmp(node a,node b)
{return a.w<b.w;
}
int find(int x)
{if(fa[x]==-1)return x;else return fa[x]=find(fa[x]);
}
ll kruskal(int n)
{memset(fa,-1,sizeof(fa));sort(edge+1,edge+1+tot,cmp);int cnt=0;ll ans=0;//cout<<tot<<endl;for(int i=1;i<=tot;i++){int u=edge[i].u;int v=edge[i].v;int w=edge[i].w;int fu=find(u);int fv=find(v);if(fu!=fv){ans+=w;fa[fu]=fv;cnt++;}//cout<<n<<" "<<cnt<<endl;if(cnt==n-1){//cout<<cnt<<endl;break;}}//cout<<tot<<endl;return ans;
}
void add(int u,int v,int w)
{edge[++tot].u=u;edge[tot].v=v;edge[tot].w=w;
}
int main()
{// cout<<gcd(4,6);//srand(time(0));//int t=1000;
// while(t--)// n=random(1,100000);// L=random(1,19999);// R=random(L,200000);// seed=(unsigned long long)random(1,10000000000000); scanf("%d%d%d%llu",&n,&L,&R,&seed);// printf("生成数据%d %d %d %llu\n",n,L,R,seed);memset(edge,0,sizeof(node));memset(a,0,sizeof(int));for(int i=1;i<=n;i++){a[i]=gen();//printf("a[%d]=%d\n",i,a[i]);//2464638799566668449} tot=0;if(L==R){cout<<1ll*(n-1)*L<<endl;return 0;} if(n>1000){cout<<(n-1)<<endl;return 0;}for(int i=1;i<=n;i++){//printf("a[%d]=%d\n",i,a[i]);for(int j=i+1;j<=n;j++){int w=gcd(a[i],a[j]);// printf("i=%d j=%d w=%d\n",i,j,w);// printf("w=%d\n",w);add(i,j,w);add(j,i,w);}}//cout<<tot<<endl;// cout<<edge[1].w;int ww=kruskal(n);cout<<ww<<endl;
// if(ww!=n-1)
// {// cout<<"错误"<<endl;
// //printf("最终%d %d %d %llu\n",n,L,R,seed);
// //cout<<"答案= "<<ww<<endl;
//
// }
// else cout<<"正确"<<endl;//cout<<"答案= "<<ww<<endl;return 0;
}/*
50000 16199 18966 29398
*/
Build Roads相关推荐
- 第十一届山东省大学生程序设计竞赛题解(9 / 13)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 VP了一下,体验不是太好,区分度不是很好,简单题太简单,难题看着就不想写-没什么意思 比赛地址: ht ...
- atcoder 2643 切比雪夫最小生成树
There are N towns on a plane. The i-th town is located at the coordinates (xi,yi). There may be more ...
- GDUT_22级专题三 F - Built?
题目描述: There are N towns on a plane. The i-th town is located at the coordinates (xi,yi). There may ...
- USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)
目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...
- 洛谷——P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- CodeForces #369 div2 D Directed Roads DFS
题目链接:D Directed Roads 题意:给出n个点和n条边,n条边一定都是从1~n点出发的有向边.这个图被认为是有环的,现在问你有多少个边的set,满足对这个set里的所有边恰好反转一次(方 ...
- hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 Problem ...
- HDU1102 Constructing Roads 最小生成树
点击打开链接 Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In Ha ...
- CF1413F. Roads and Ramen(树的直径,线段树)
CF1413F. Roads and Ramen Solution 感觉这个套路也见过许多次了?大概这种奇奇怪怪的树上最长路径的题都得往直径靠一靠. 大概有个结论是:存在一个最优路径使得其起始点和直径 ...
最新文章
- 净化心灵的诗歌--《当你老了》
- Medoo入门:安装和配置-Medoo使用指南
- 深度学习框架的评估与比较
- 思考…求知(boolean和Boolean的区别)
- 2009.11网络工程师考试案例试题学习攻略(1)
- lync服务器不响应或无法联系,Lync 用户无法与外部联系人通信 - Skype for Business | Microsoft Docs...
- Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——例题9-3
- 轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单 demo
- python多级字典嵌套_使用pythonscsv DictReader创建多级嵌套字典
- YOLO,VOC数据集标注格式解析
- html 5 video
- 宝塔面板nginx跨域配置(跳坑)
- DevOps 实践指南
- 量子机器学习HHL算法总结图文
- antd 表单 校验、取值、重置
- JAVA实现简易的酒店管理系统
- Spring bean是什么?
- EtherCAT设备协议详解一、EtherCAT概述
- penn treebank_Penn Manor致力于开源
- android开机自动启动app,Android实现开机自动启动Service或app的方法
热门文章
- 学会了!如果认错人了,就像这样亲一口!
- 一分钟教你用Excel从统计局抓数据!
- 程序猿的双十一最佳攻略
- 巴比伦算法求平方根c语言,巴比伦算法求平方根
- swoole会合并到php吗,thinkphp整合swoole
- c++歌手大赛系统_计人即讯|第十届程序设计大赛
- 计算机表演赛新疆赛区,【图】第二十六届中国儿童青少年威盛中国芯HTC计算机表演赛“中国电信天翼杯”新疆赛区总决赛圆满结束_乌鲁木齐教育信息网...
- get+php+mysql_Apache+PHP+MySql 的安装及配置
- java富文本如何转义_富文本编辑器wangEditor中转义字符的问题
- android qq红包,Android实现QQ抢红包插件