[USACO14JAN]Ski Course Rating G
题目链接:https://www.luogu.com.cn/problem/P3101
Slove
这题我们可以尝试建立一个图。
以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值从小到大排序。
然后就可以愉快地使用并查集了:
一开始将每一个点划分到自己的集合。
每次枚举一条边,判断所枚举的边的两个点是否在同一个集合内,如果在就不管,不在就将这两个节点所处的集合进行合并。
每枚举一条边,如果发现合并后的集合点数已经不少于t个,且合并前有集合的点数小于t,如果以前这个集合里面包含终点,答案就直接加上当前边的权值就好了。
每次集合合并时需要合并的信息有集合大小和集合中是否含起点
Code
#include<bits/stdc++.h>
using namespace std;
struct bian
{
int a,b;
long long c;
}s[1000000];
int cmp(bian xx1,bian xx2)
{
if(xx1.c!=xx2.c)return xx1.c<xx2.c;
else
{
if(xx1.a!=xx2.a)return xx1.a<xx2.a;
else return xx1.b<xx2.b;
}
}
int m,n,t,bcj[1000000],tot=0,lll;
long long mm[1000][1000],num[1000000],siz[1000000],ans=0;
int find(int x)//并查集-找祖宗
{
int zz;
if(bcj[x]==x)zz=x;
else zz=find(bcj[x]);
bcj[x]=zz;
return zz;
}
int main()
{
scanf("%d%d%d",&m,&n,&t);
for(int i=1;i<=m*n*3;i++)bcj[i]=i,siz[i]=1;//预处理
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)cin>>mm[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(i!=1)s[++tot].a=(i-1)*n+j,s[tot].b=(i-2)*n+j,s[tot].c=abs(mm[i][j]-mm[i-1][j]);
if(j!=1)s[++tot].a=(i-1)*n+j,s[tot].b=(i-1)*n+j-1,s[tot].c=abs(mm[i][j]-mm[i][j-1]);
}
//建边
sort(s+1,s+tot+1,cmp);//排序
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&lll);
if(lll==1)num[(i-1)*n+j]=1;//给起点打上标记(第i行第j列的点编号为((i-1)*n+j))
}
for(int i=1;i<=tot;i++)
{
int fa=find(s[i].a),fb=find(s[i].b);
if(fa==fb)continue;//在同一个集合中
if(siz[fa]+siz[fb]>=t)//判断集合是否满足条件
{
if(siz[fa]<t)ans+=s[i].c*num[fa];
if(siz[fb]<t)ans+=s[i].c*num[fb];
}
num[fa]+=num[fb],siz[fa]+=siz[fb],bcj[fb]=fa;//合并信息
}
cout<<ans<<endl;
return 0;
}
[USACO14JAN]Ski Course Rating G的更多相关文章
- LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating
LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating [问题描述] The cross-country skiing course at the winter Mool ...
- [USACO14JAN]滑雪等级Ski Course Rating
题目描述 The cross-country skiing course at the winter Moolympics is described by an M x N grid of eleva ...
- BZOJ 3430: [Usaco2014 Jan]Ski Course Rating(并查集+贪心)
题面 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 136 Solved: 90 [Submit][Status][Discuss] Descript ...
- [USACO09OPEN]Ski Lessons
嘟嘟嘟 先考虑这两点: 1.如果我们有结束时间相同的课程,且达到的能力相同,那么我们一定选择开始时间最晚的. 2.如果有能力值相同的滑雪坡,我们一定选择时间最短的. 因此先预处理两个数组.cla[i] ...
- Atcoder Rating System
来翻译一下官方文档,但是建议看英文原文,本文可能会出现一些错误,只是为了方便自己查阅用的. 对于你的每一场rated比赛,会有一个Performance值\(X_i\),你的rating是\(X_i- ...
- BZOJ-USACO被虐记
bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Entity Framework 6 Recipes 2nd Edition(10-10)译 - > 为TPH继承的插入、更新、删除操作映射到存储过程
10-10. 为TPH继承的插入.更新.删除操作映射到存储过程 问题 TPH继承模型,想把它的插入.修改.删除操作映射到存储过程 Solution 假设数据库有一个描述不同种类的产品表(Product ...
- 《HeadFirst SQL》笔记
规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 ...
随机推荐
- docker查看ip
docker查看容器的网络ip docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' conta ...
- golang 爬取百度贴吧绝地求生页面
package main import ( "github.com/antchfx/htmlquery" "io" "net/http" & ...
- Ambari仓库安装教程
Ambari仓库安装教程 如果用户需要后续使用Ambari server进行安装Hadoop则必须搭建一个内部的yum源,否则直接下载速度将会很慢,当然该服务仅要搭建一个即可,可以一直使用. 一.Ce ...
- 【事件中心 Azure Event Hub】Event Hub Java SDK的消费端出现不消费某一个分区中数据的情况,出现IdleTimerExpired错误消息记录
问题情形 使用Java SDK编写的Event Hub消费端应用,随机性遇见了某个分区没有消费消息的情况,在检查日志时候,有发现IdelTimeExpired的错误记录.在重启应用后,连接EventH ...
- Dubbo 常用模型
先了解如下几个概念 Invoker Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现 ...
- 【洛谷】 cpp-->c 一道好玩的显示题
P1538 这题真的好玩 题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同 ...
- Chrome FeHelper 插件下载地址
方便大家下载 下载可用,本人亲自测试 下载地址: 地址链接
- 最新主流 Markdown 编辑器推荐
Markdown ,2004年由 John Gruberis 设计和开发,是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,以下将介绍目前比较流行的一 ...
- JAVA类库之——Math类(持续更新)
Math类 目录 Math类 1.Math 类中的常量方法 返回π(圆周率)值的方法:PI 返回E(自然对数低)值的方法:E 2.Math 类中的三角函数方法 计算正弦函数值的方法:Sin(radia ...
- Linux 系统编程 学习:11-线程:线程同步
Linux 系统编程 学习:11-线程:线程同步 背景 上一讲 我们介绍了线程的属性 有关设置.这一讲我们来看线程之间是如何同步的. 额外安装有关的man手册: sudo apt-get instal ...