题意
现在是时刻 0 0 0,航班在 p 0 p_0 p0时刻起飞
有 n n n个人,第 i i i个人速度为 s i / h s_i/h si/h,每个人距离机场距离 x x x
显然有 k k k次公告,第 i i i次表示在时刻 t i t_i ti开始时,告诉所有人航班延迟到 p i p_i pi起飞
同时设一个人在时刻 f f f,此时航班在 P P P时刻起飞,距离机场 X X X米
只有当 ( P − f + 1 ) ∗ s i > = X (P-f+1)*s_i>=X (P−f+1)∗si>=X时,这个人才会向机场出发,否则不动.
问有几个人能到机场
显然如果在 p p p时刻某个人开始跑动,那么他一定会持续的跑下去直到到达终点
因为这段时间航班只会推迟不会提前,所以一定能跑下去
所以只需要看每个人是否能起跑就行了
也就是找到 m x = m a x ( p i − t i ) \rm mx=max(p_i-t_i) mx=max(pi−ti)
此时这个人能跑 m x mx mx秒,能跑到他就能开跑
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int s[maxn],t[maxn],p[maxn],n,m,x,p0;
int main()
{
cin >> n >> m >> x >> p0;
for(int i=1;i<=n;i++) scanf("%d",&s[i] );
for(int i=1;i<=m;i++) scanf("%d",&t[i] );
for(int i=1;i<=m;i++) scanf("%d",&p[i] );
int mx = p0, ans = 0;
for(int i=0;i<=m;i++) mx = max( mx,p[i]-t[i] );
for(int i=1;i<=n;i++) ans += (1ll*mx*s[i]>=x);
cout << ans;
}