1 条题解
-
0
自动搬运
来自洛谷,原作者为

tder
喵喵喵。搬运于
2025-08-24 22:53:33,当前版本为作者最后更新于2023-12-24 20:36:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
伟大的不等式组。
令 表示第 个植物经过 天后的高度,有:
根据 的定义,若用 表示 FJ 希望长到第 高的植物,易得,对于 :
那么,若最少经过 天后满足 FJ 的要求,显然有 ,即:
$$\begin{cases} d_{p_1}(k)>d_{p_2}(k) \\ d_{p_2}(k)>d_{p_3}(k) \\ \cdots \\ d_{p_{n-1}}(k)>d_{p_n}(k) \\ \end{cases} $$分开来说,对于排名相邻的两个植物 和 ,有 ,即 ,化简得:
分类讨论 的正负:
- 当 ,即 时,有 ;
- 当 ,即 时,有 ;
- 当 ,即 时,有 ,即 :
- 若 ,;
- 反之,若 ,无解。
此时我们得到了 个不等式。其中,有 个不等式 大于某值, 个不等式 小于某值, 个结果 ,以及 个无解。
若 ,显然无解,输出 。由于 ,可以忽略所有 个结果。接下来考虑剩余的 个 和 个 。那么,根据初中课本中的「同大取大,同小取小」,易得 及 。合并,得:
- 若 ,且区间 中至少含有 个正整数,则 ;
- 反之,则无解。
时间复杂度 。
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 5, M = 1e9 + 5; int T, n, h[N], a[N], t[N], p[N]; double q1 = -1, q2 = N; int work() { cin>>n; for(int i = 1; i <= n; i++) cin>>h[i]; for(int i = 1; i <= n; i++) cin>>a[i]; for(int i = 1; i <= n; i++) { cin>>t[i]; p[t[i] + 1] = i; } if(n == 1) return 0; q1 = -1, q2 = M; for(int i = 1; i < n; i++) { int x = p[i], y = p[i + 1]; if(a[x] > a[y]) q1 = max(q1, 1.0 * (h[y] - h[x]) / (a[x] - a[y])); else if(a[x] < a[y]) q2 = min(q2, 1.0 * (h[y] - h[x]) / (a[x] - a[y])); else if(h[x] <= h[y]) return -1; } if(q1 < q2) { double r = floor(q1) + 1; if(r < q2) return r; else return -1; } else return -1; } signed main() { cin>>T; while(T--) cout<<work()<<endl; return 0; // f(i) = h[x] + i * a[x], g(i) = h[y] + i * a[y] // f(i) > g(i) // h[x] + i * a[x] > h[y] + i * a[y] // (a[x] - a[y]) * i > (h[y] - h[x]) // 1. a[x] - a[y] > 0, i > (h[y] - h[x]) / (a[x] - a[y]) // 2. a[x] - a[y] < 0, i < (h[y] - h[x]) / (a[x] - a[y]) // 3. a[x] - a[y] = 0, 0 > (h[y] - h[x]) // I. h[y] - h[x] < 0, i in R // II. h[y] - h[x] >= 0, i in empty }
- 1
信息
- ID
- 9591
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者