题目描述

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.

滑雪场用一个M*N(1 <= M,N <= 500)的数字矩阵表示海拔高度,每个数字表示一个范围在0 .. 1,000,000,000的高度。有些格子被指定为起点,组织者想对这些起点做难度评级。

如果起点P点是一个难度级别为D的起点,则D必须是满足以下条件的一个最小值:

(1)从一个格子只能滑到相邻的格子;

(2)这两个格子的海拔差不超过D;

(3)至少能够到达T(1 <= T <= M*N)个格子(包括起点本身)。

输入输出格式

输入格式:

* 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.

输出格式:

* 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).

输入输出样例

输入样例#1:

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
输出样例#1:

24

说明

The ski course is described by a 3 x 5 grid of elevations. The upper-left and lower-right cells are designated as starting points. From each starting point, we must be able to reach at least 10 cells.

The difficulty rating of the upper-left starting point is 4, and for the lower-right it is 20.


woc我要骂人, 这sb题调了我2小时。

日了,不知道哪里的玄学错误找错找了2小时, 最后重写了一边才A。

吐槽完了ri....

一看这道题...水...暴力二分+bfs结果光荣tle;

emm...

我们把每个点与它下边和右边的点连起来,边权是他们的高度差,然后按照边权排序,不停的合并两个端点的集合。

一旦发现两个集合合并之后,它的siz>T,那么立即更新答案,但是以前更新过的集合不需要加入打哪中。

然后再按秩合并。

我们维护每一个集合的siz, num(是这个集合里有多少个出发点);

然后更新答案的时候, 如果之前的那个小集合没有更新过答案,那么ans += ed[i].val * num[x];

因为我们边权是从小到达排序的,所以不用担心得到错误的答案,使得这个集合大小第一次大于T的边,一定是满足题意的最小边。


附上折磨了我一晚上的代码...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
inline int read(){
int res=;char ch=getchar();bool fl=;
while(!isdigit(ch)){if(ch=='-')fl=;ch=getchar();}
while(isdigit(ch)){res=(res<<)+(res<<)+(ch^);ch=getchar();}
return fl?-res:res;
}
int dx[]={, , }, dy[]={, , };
int n, m, T;
int cnt, tot;
long long ans;
struct edge{
int x, y, val;
bool operator < (edge b) {return val < b.val;}
}ed[];
int h[][];
int fa[], sz[];
int id[][], num[];
int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);} signed main()
{
n = read(), m = read(), T = read();
tot = ;
for (register int i = ; i <= n ; i ++)
{
for (register int j = ; j <= m ; j ++)
{
h[i][j] = read();
tot+=;
id[i][j] = tot;
fa[id[i][j]] = id[i][j];
sz[id[i][j]] = ;
}
}
//cout<<tot<<endl;
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= m; ++j)
{
int o = read();
if (o) num[id[i][j]]=;
for (int k = ; k <= ; ++ k)
{
int tx=i+dx[k],ty=j+dy[k];
if (tx<n+&&ty<m+) ed[++cnt]=(edge){id[i][j],id[tx][ty],abs(h[i][j]-h[tx][ty])};
}
}
}
// cout<<tot<<endl;
// cout<<n<<endl<<m<<endl;
// cout<<n*m<<endl;
sort(ed + , ed + + cnt);
// cout<<cnt<<endl;
for (register int i = ; i <= cnt ; i ++)
{
int x = ed[i].x, y = ed[i].y;
int fx = Find(x), fy = Find(y);
if (fx== fy) continue;
if (sz[fx] + sz[fy] >= T)
{
if (sz[fx] < T) ans += 1ll * ed[i].val * num[fx];
if (sz[fy] < T) ans += 1ll * ed[i].val * num[fy];
}
if (sz[fx] > sz[fy]) swap(fx, fy);
fa[fx] = fy;
sz[fy] += sz[fx], num[fy] += num[fx];
}
cout<<ans<<endl;
return ;
}

[USACO14JAN]滑雪等级Ski Course Rating的更多相关文章

  1. LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating

    LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating [问题描述] The cross-country skiing course at the winter Mool ...

  2. 【USACO2009 Open】滑雪课程ski

    [USACO2009 Open]滑雪课程 Ski Lessons Time Limit: 1000 ms Memory Limit: 131072 KBytes Description 约翰请贝西去科 ...

  3. [USACO14JAN]Ski Course Rating G

    题目链接:https://www.luogu.com.cn/problem/P3101 Slove 这题我们可以尝试建立一个图. 以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值 ...

  4. [USACO09OPEN]滑雪课Ski Lessons

    题目描述 Farmer John wants to take Bessie skiing in Colorado. Sadly, Bessie is not really a very good sk ...

  5. BZOJ 1571: [Usaco2009 Open]滑雪课Ski

    Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S& ...

  6. [bzoj1571][Usaco2009 Open]滑雪课Ski

    题目描述 Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100 ...

  7. 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski

    还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...

  8. BZOJ——1571: [Usaco2009 Open]滑雪课Ski

    http://www.lydsy.com/JudgeOnline/problem.php?id=1571 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit:  ...

  9. [USACO2009 OPEN] 滑雪课 Ski Lessons

    洛谷P2948 看到题目就觉得这是动规但一直没想到如何状态转移……看了别人的题解之后才有一些想法 f[i][j]:前i单位时间能力值为j可以滑的最多次数 lessons[i][j]:结束时间为i,获得 ...

随机推荐

  1. Hadoop数据收集与入库系统Flume与Sqoop

    Hadoop提供了一个中央化的存储系统,其有利于进行集中式的数据分析与数据共享. Hadoop对存储格式没有要求.可以存储用户访问日志.产品信息以及网页数据等数据. 常见的两种数据来源.一种是分散的数 ...

  2. 带你入门SpringCloud统一配置 | SpringCloud Config

    前言 在微服务中众多服务的配置必然会出现相同的配置,如果配置发生变化需要修改,一个个去修改然后重启项目的方案是绝对不可取的.而 SpringCloud Config 就是一个可以帮助你实现统一配置选择 ...

  3. 为什么Kubernetes使用Pod作为最小调度单元

    一.Pod说明 Pod只是一个逻辑概念,一个原子调度单位,其优势在于 可以统一调度一组容器到指定的node上 共享资源,Pod的容器可以使用localhost进行通信,使用volume进行文件共享.使 ...

  4. Android的显示意图和隐式意图总结

    显示意图 简而言之: 通过指定特定Activity的包名和类名开启Activity 应用场景: 一般应用于本App内的activity间的跳转. XML配置信息: AndroidManifest.xm ...

  5. OAuth2.0摘要

    一.简介 不使用oauth2.0协议,资源所有者直接给需要使用资源的第三方应用共享凭据时,有这些问题: 需要直接共享给第三方应用凭据 需要服务器支持密码身份验证 凭据的访问权限过大,失去对访问时间和范 ...

  6. Hibernate4之JPA规范配置详解

    @Table Table用来定义entity主表的name,catalog,schema等属性. 属性说明: name:表名 catalog:对应关系数据库中的catalog schema:对应关系数 ...

  7. centos下U盘重装windows

    当前机器使用的都是centos系统,后来想使用windows,这时候就需要在centos下去安装windows系统啦. 当然是采用U盘安装啦,先准备U盘,U盘数据先备份以免丢失. 第一步:制作U盘启动 ...

  8. ubuntu linux重置密码

    (和网上的有点不一样,记录一下) 1)重启系统,同时长时间按住shift键进入grub菜单:GNU GRUB version 1.99-12ubuntu5(如图一) 2)选择Ubuntu, with ...

  9. linux 查看文件大小命令

    1.# ls -l (k) ls -l total -rw-r----- root root Oct : catalina.--.log -rw-r----- root root Oct : cata ...

  10. SSM框架手动实现分页逻辑(非PageHelper)

    第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...