首页 > 其他分享 >P3101 [USACO14JAN] Ski Course Rating G

P3101 [USACO14JAN] Ski Course Rating G

时间:2023-09-13 10:57:12浏览次数:50  
标签:Rating idx get P3101 查集 long Ski find 起点

思路

晃一眼题目,这不和这道题一样吗?

但是再仔细一看,有有些不一样,要求了起点至少到多少个点,不要求起点互通,求的也不是最小的 \(d\),而是 \(d\) 之和。

首先,很容易地发现,这道题再去二分肯定不现实,每个点都去二分一次,所需要的时间也很恐怖。

所以我们尝试从其他的方面入手。

可以发现,如果一个连通块的长度符合条件,那么整个连通块的点都符合条件,那么我们能否在更新并查集的时候,顺便维护这个并查集里的起点的个数呢。

这样的话,只要这个并查集符合条件,那么就直接取出这个并查集的起点个数,乘以答案,再把这个连通块的起点个数改为 \(0\) 就好。

那么怎么获得答案呢?

考虑对所有的边按照权值从小到大排序,权值就是两个点的高度差,那么这样的话,我们就先加权值小的边,这样就可以尽可能地使 \(d\) 变小了。

另外,因为是二维图,为了方便,我们采用二维转一维。

AC code

#include<bits/stdc++.h>
using namespace std;
struct edge{long long u,v,w;}b[500005];
inline bool cmp(edge a,edge b){return a.w<b.w;}//边排序
long long rt,n,m,T,h[505][505],idx,sum,fa[250005],siz[250005],ans[250005],k;
long long find(long long x){return (fa[x]==x)?x:fa[x]=find(fa[x]);}//并查集
inline long long get(long long i,long long j){return (i-1)*m+j;}//二维转一维
int main()
{
	scanf("%lld%lld%lld",&n,&m,&T);
	for(long long i=1;i<=n;++i)
		for(long long j=1;j<=m;++j)
		{
			scanf("%lld",&h[i][j]);
			if(i>1) b[++idx].u=get(i-1,j),b[idx].v=get(i,j),b[idx].w=abs(h[i][j]-h[i-1][j]);
			if(j>1) b[++idx].u=get(i,j-1),b[idx].v=get(i,j),b[idx].w=abs(h[i][j]-h[i][j-1]);//建边
		}
	sort(b+1,b+idx+1,cmp);//排序
	for(long long i=1;i<=n;++i) for(long long j=1;j<=m;++j){scanf("%lld",&ans[get(i,j)]),k+=ans[get(i,j)];}
	if(T==1) printf("%lld",k),exit(0);//特殊情况
	for(long long i=1;i<=n*m;++i) siz[i]=1,fa[i]=i;//初始化
	for(long long i=1;i<=idx;++i)
		if(find(b[i].u)!=find(b[i].v))
		{
			siz[find(b[i].v)]+=siz[find(b[i].u)],ans[find(b[i].v)]+=ans[find(b[i].u)];
			if(siz[find(b[i].v)]>=T) sum+=ans[find(b[i].v)]*b[i].w,ans[find(b[i].v)]=0;//记得把起点个数清零,否则会重复统计
			fa[find(b[i].u)]=find(b[i].v);//这个要放在最后
		}
	printf("%lld",sum);
}

标签:Rating,idx,get,P3101,查集,long,Ski,find,起点
From: https://www.cnblogs.com/One-JuRuo/p/17698935.html

相关文章

  • 安装CentOS7 解决错误信息:Warning: /deu/root does not exist Generating
    本文适用于错误信息"Warning:/deu/rootdoesnotexistGenerating"的一种情况不适用于错误信息"Warning:/dev/rootdoesnotexist,couldnotboot" 在给一台老旧的 DellR710安装CentOS7时发现的一个错误"Warning:/deu/rootdoesnotexistGenerating" 看了好......
  • 2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算
    2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单req_skills,并打算从备选人员名单people中选出些人组成一个「必要团队」(编号为i的备选人员people[i]含有一份该备选人员掌握的技能列表)。所谓「必要团队」,就是在这个团队中,对于所需求的技能列表req_skills......
  • 2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算
    2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单req_skills,并打算从备选人员名单people中选出些人组成一个「必要团队」(编号为i的备选人员people[i]含有一份该备选人员掌握的技能列表)。所谓「必要团队」,就是在这个团队中,对于所需求的技能列表req_sk......
  • appium更多参数noReset、dontStopAppOnReset、skipDeviceInitialization、unicodeKeyB
    正常参数设置'platformName'、'platformVersion'、appActivity、deviceName、webdriver.Remote更多的参数设置,可以提高用例的稳定性"noReset":"true",//不清空缓存信息"dontStopAppOnReset":"true",//首次启动的时候,不停止app"skipDevi......
  • 《PROMPT2MODEL: Generating Deployable Models from Natural Language Instructions
    一、Introduction传统上,从零开始构建一个自然语言处理(NLP)模型是一项重大任务。一个寻求解决新问题的NLP从业者需要定义他们的任务范围,找到或创建目标任务领域的行为数据,选择合适的模型架构,训练模型,通过评估评估其性能,然后将其部署到实际应用中。Prompt2Modelisaframeworkfo......
  • P8386 [PA2021] Od deski do deski
    P8386[PA2021]Oddeskidodeski洛谷:OddeskidodeskiLOJ3600OddeskidodeskiSolution先考虑如何判定一个序列\(a\)是否合法。记\(dp_{i}=0/1\)表示考虑前\(i\)个数是否能被删空:\(dp_{i}\xleftarrow{\texttt{or}}dp_{j-1}[a_i=a_j]\)。初始化\(dp_{0}=......
  • What's the best approach for generating a new API key?
    https://stackoverflow.com/questions/14412132/whats-the-best-approach-for-generating-a-new-api-keyEdit:I'vespoketoafewfriends(email/twitter)andtheyrecommendedjustusingaGUIDwiththedashesstripped.......
  • ThingsKit物联网平台告警中心之告警联系人
    告警联系人是指接收告警信息的人,产生告警后,会第一时间通知他。新增点击新增告警联系人按钮,填入相关信息,确认新增。告警联系人参数参数说明联系人姓名定义告警通知到的联系人名称必填支持输入的格式:中英文、字符、数字支持输入的长度限制:30个字符||所属组......
  • ThingsKit物联网平台告警中心之告警记录
    概述当设备达到预先指定的阈值时,平台会自动产生告警,可以通过告警记录及时查看详细的告警信息以及对告警进行处理和反馈。详情场景联动中设备产生的告警记录详情。:::info......
  • ThingsKit物联网平台告警中心之告警配置
    告警配置是指对告警联系人,告警通知方式进行配置。新增点击新增告警配置,填入相关信息和告警联系人。告警配置参数参数说明告警配置名称定义告警配置名称必填支持输入的格式:中英文、字符、数字支持输入的长度限制:30个字符||所属组织|选择组织来选择告警......