P9976 [USACO23DEC] Farmer John Actually Farms B 题解
伟大的不等式组。
令
根据
那么,若最少经过
分开来说,对于排名相邻的两个植物
分类讨论
- 当
a_x-a_y>0 ,即a_x>a_y 时,有k>\frac{h_y-h_x}{a_x-a_y} ; - 当
a_x-a_y<0 ,即a_x<a_y 时,有k<\frac{h_y-h_x}{a_x-a_y} ; - 当
a_x-a_y=0 ,即a_x=a_y 时,有0>h_y-h_x ,即h_x>h_y :- 若
h_x>h_y ,k\in\mathbb{R} ; - 反之,若
h_x\le h_y ,无解。
- 若
此时我们得到了
若
- 若
\max(q1_i)<\min(q2_i) ,且区间(\max(q1_i),\min(q2_i)) 中至少含有1 个正整数,则k=\lfloor\max(q1_i)\rfloor+1 ; - 反之,则无解。
时间复杂度
#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
}