BZOJ 3430: [Usaco2014 Jan]Ski Course Rating(并查集+贪心)
题面
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 136 Solved: 90
[Submit][Status][Discuss]
Description
The cross-country skiing course at the winter Moolympics is described by an M x N grid of elevations (1 <= M,N <= 500), each elevation being in the range 0 .. 1,000,000,000. Some of the cells in this grid are designated as starting points for the course. The organizers of the Moolympics want to assign a difficulty rating to each starting point. The difficulty level of a starting point P should be the minimum possible value of D such that a cow can successfully reach at least T total cells of the grid (1 <= T <= MN), if she starts at P and can only move from cell to adjacent cell if the absolute difference in elevation between the cells is at most D. Two cells are adjacent if one is directly north, south, east, or west of the other. Please help the organizers compute the difficulty rating for each starting point.
给定一个n*m的高度矩阵,一个点的难度P是指 最小的D使得以这个点为起点,可到达的格子数量至少为T,一个格子可以到另外一个格子必须保证两个格子相邻且高度差不超过D,相邻是指4-相邻。再给定一个同样大小的01矩阵,求出所有1处格子的难度和。
Input
Line 1: The integers M, N, and T.
Lines 2..1+M: Each of these M lines contains N integer elevations.
Lines 2+M..1+2M: Each of these M lines contains N values that are either 0 or 1, with 1 indicating a cell that is a starting point.
Output
- Line 1: The sum of difficulty ratings of all starting points (note that this may not fit into a 32-bit integer, even though individual difficulty ratings will).
Sample Input
3 5 10
20 21 18 99 5
19 22 20 16 17
18 17 40 60 80
1 0 0 0 0
0 0 0 0 0
0 0 0 0 1
Sample Output
24
OUTPUT DETAILS: The difficulty rating of the upper-left starting point is 4, and for the lower-right it is 20.
解题思路
首先这道题肯定要用并查集来维护连通性,按照边权排序后一条一条的加边,在并查集中还要维护一下每个联通块的大小和联通块内起点的数量,因为每个点只会被更新一次,所以当两个联通块合并时大小\(>=t\),而合并前没有时就统计答案。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN = 505*505;
typedef long long LL;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,m,siz[MAXN],fa[MAXN],t,cnt,num,a[505][505],sum[MAXN];
LL ans;
struct Edge{
int u,v,w;
friend bool operator<(const Edge A,const Edge B){
return A.w<B.w;
}
}edge[MAXN<<2];
inline int calc(int x,int y){
return (x-1)*m+y;
}
inline void add(int x,int y,int w){
edge[++cnt].u=x;edge[cnt].v=y;edge[cnt].w=w;
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
n=rd(),m=rd(),t=rd();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
a[i][j]=rd();
if(i!=1) add(calc(i-1,j),calc(i,j),abs(a[i][j]-a[i-1][j]));
if(j!=1) add(calc(i,j-1),calc(i,j),abs(a[i][j]-a[i][j-1]));
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
fa[calc(i,j)]=calc(i,j),siz[calc(i,j)]=rd(),sum[calc(i,j)]=1;
sort(edge+1,edge+1+cnt);
for(int i=1;i<=cnt;i++){
int u=find(edge[i].u),v=find(edge[i].v);
if(u==v) continue;
if(sum[u]<t && sum[u]+sum[v]>=t) ans+=(LL)siz[u]*edge[i].w;
if(sum[v]<t && sum[u]+sum[v]>=t) ans+=(LL)siz[v]*edge[i].w;
fa[u]=v;siz[v]+=siz[u];sum[v]+=sum[u];
}
printf("%lld\n",ans);
return 0;
}
BZOJ 3430: [Usaco2014 Jan]Ski Course Rating(并查集+贪心)的更多相关文章
- bzoj 1576: [Usaco2009 Jan]安全路经Travel——并查集+dijkstra
Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...
- 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版
可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...
- bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】
bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...
- BZOJ 3432: [Usaco2014 Jan]Cross Country Skiing (二分+染色法)
还是搜索~~可以看出随着D值的增大能到达的点越多,就2分d值+染色法遍历就行啦~~~ CODE: #include<cstdio>#include<iostream>#incl ...
- BZOJ 3433 [Usaco2014 Jan]Recording the Moolympics:贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3433 题意: 给出n个区间[a,b). 有两个记录器,每个记录器中存放的区间不能重叠. 求 ...
- 【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)
题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠.求2个记录器中最多可放多少个区间. 解法:贪心.只有1个记录器的做法详见--关于贪心算法的经典问题(算法效率 or 动态规划 ...
- 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...
- BZOJ 1050 旅行comf(枚举最小边-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...
- bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普 ...
随机推荐
- ofbiz:找不到org.ofbiz.widget.ContentWorkerInterface的类文件
ofbiz编译报错: 找不到org.ofbiz.widget.DataResourceWorkerInterface的类文件 找不到org.ofbiz.widget.ContentWorkerInte ...
- c++ 获取文件图标,类型名称,属性 SHGetFileInfo
SHGetFileInfo是一个相当实用的Windows API函数. // [MoreWindows工作笔记4] 获取文件图标,类型名称,属性 SHGetFileInfo #include < ...
- ShopNC B2B2C最新版去除shop方法教程
1.转移shop下目录文件至根目录: 2.修改config.ini.php里的shop绑定域名更改为无shop目录: 3.将原始根目录的index.php更改为main.php文件名自己定!并修改in ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
- android.os.NetworkOnMainThreadException异常 (转)
转:http://blog.csdn.net/wotoumingzxy/article/details/7797295 这个异常大概意思是在主线程访问网络时出的异常. Android在4.0之前的版本 ...
- 兼容iphone x刘海的正确姿势
在 ios 11 中我们可以使用 viewport-fit=cover + safe-area-inset-*. 那么是不是 ios11 以下就用不了这些了呢?是的,但你见过 iphone x+ 有 ...
- lambda(),map(),filter()
Lambda 函数 Lambda 函数是一种比较小的匿名函数.Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda 函数,我们根本没为它命名.这是因 ...
- JS轻松实现单击文本框弹出选择日期
我的开发工具是vs2005,你们可选择自己合适的开发工具 首先创建个文本框<input id="txFDate" name="txFDate" type= ...
- 在python中创建列表的最佳和/或最快方法
在python中,据我所知,至少有3到4种方法来创建和初始化给定大小的列表: 简单循环append: my_list = [] for i in range(50): my_list.append(0 ...
- 解决Redhat yum出现This system is not registered with RHN的方案
最近博主在学习Linux,菜鸟级别的的选手连装个Chrome都觉得难,悲了个催的……百度了很多教程,大多是类似的.博主的配置是在VM8下搭建的RHEL5.3 (Tikanga)版本,不知道什么原因,每 ...