题面

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(并查集+贪心)的更多相关文章

  1. bzoj 1576: [Usaco2009 Jan]安全路经Travel——并查集+dijkstra

    Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...

  2. 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版

    可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...

  3. bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】

    bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...

  4. BZOJ 3432: [Usaco2014 Jan]Cross Country Skiing (二分+染色法)

    还是搜索~~可以看出随着D值的增大能到达的点越多,就2分d值+染色法遍历就行啦~~~ CODE: #include<cstdio>#include<iostream>#incl ...

  5. BZOJ 3433 [Usaco2014 Jan]Recording the Moolympics:贪心

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3433 题意: 给出n个区间[a,b). 有两个记录器,每个记录器中存放的区间不能重叠. 求 ...

  6. 【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)

    题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠.求2个记录器中最多可放多少个区间. 解法:贪心.只有1个记录器的做法详见--关于贪心算法的经典问题(算法效率 or 动态规划 ...

  7. 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...

  8. BZOJ 1050 旅行comf(枚举最小边-并查集)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...

  9. bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普 ...

随机推荐

  1. 【Shell】ps -ef 和ps aux

    两者没太大差别 追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现 ...

  2. mac 格式化U盘

    作者:Bailm链接:https://www.zhihu.com/question/27888608/answer/486347894来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  3. USB驱动程序设计

    1.USB驱动模型 ①USB HOST控制器驱动 ②USBhexin ③USB客户端驱动 设备4个层次:设备(device).配置(Config).接口(Interface).端点(Endpoint) ...

  4. iframe中涉及父子页面跨域问题

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制.所谓同源是指相同的域名.协议和端口,只要其中一项不同就为跨域. 举几个例子: http:/ ...

  5. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  6. 利用core_pattern实现core文件的配置和管理

    参考:https://xz.aliyun.com/t/1098 这里所说的core_pattern 指的是:/proc/sys/kernel/core_pattern. 我们知道在Linux系统中,如 ...

  7. NGINX-二级域名

    先给二级域名添加到 DNS 解析再配置 nginx server { #侦听80端口 listen 80; #定义使用 www.nginx.cn访问 server_name ~^(?<subdo ...

  8. 重写__eq__函数——对象list中使用in index()——获得list中不同属性对象个数

    https://blog.csdn.net/anlian523/article/details/80868961

  9. maven项目报错:Class path contains multiple SLF4J bindings

    maven项目编译不报错,运行时报错如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [b ...

  10. 递归中,调用forEach方法问题

    1 function traverse(objNmae,obj,url){ url = url || objNmae; if(typeof obj === "object" ){ ...