专栏文章
题解:[ABC385F] Visible Buildings
AT_abc385_f题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqpktlc
- 此快照首次捕获于
- 2025/12/04 08:39 3 个月前
- 此快照最后确认于
- 2025/12/04 08:39 3 个月前
看起来很难,实际上是一道简单的初中数学题。学过一次函数(雾)的都应该会做。
赛时分析(有改动)
题目告诉我们,一个位置 的建筑从 可见,当且仅当从 到建筑 的视线不会被其他建筑阻挡。
我们说建筑 是可见的,当且仅当:
也就是说:
对于所有 都需要满足。
因此,为了使所有建筑物可见, 必须大于上述公式中最大值。不难发现, 的最大值是由两个相邻的建筑 决定的。因此只需考虑相邻建筑即可,将时间复杂度优化为 。
我们来模拟一下第一个样例。
时,。
时,
所以,最大值 。
赛时代码
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
double maxh = - 1e18;
pair <int, int> h[200010];
signed main() {
ios :: sync_with_stdio(false);
cin . tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i ++) cin >> h[i] . first >> h[i] . second; // 输入
for (int i = 2; i <= n; i ++) {
// 注意需要从第二个开始,因为取的是相邻的
int X_1 = h[i] . first, H_1 = h[i] . second;
int X_2 = h[i - 1] . first, H_2 = h[i - 1] . second;
// 这里分别表示出相邻的两栋楼
maxh = max(maxh, (double)(H_2 * X_1 - H_1 * X_2) / (double)(X_1 - X_2));
// 求斜率并取最大值
}
if (maxh < 0) cout << "-1" << endl;
// 无解
else cout << fixed << setprecision(12) << maxh << endl;
// 输出结果
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...