题目描述:
一个汽车从点0驶向点n,过程中会经过k+1个标志点。汽车在每两个标志点恒速行驶,分别在特定分钟数通过这些标志点。我们有q个查询,每个查询为一个点c,需知道汽车到达该点所需的时间,结果四舍五入至最接近的整数。
思路:
查询某个点在的区间 , 我们使用二分 , 然后通过速度算出具体的时间 因为在某段区间为匀速 , 所以通过速度公式可以算出速度 a i + 1 − a i b i + 1 − b i 1. 如果二分出来的 a i 等于 c , 直接输出 b i 即可 2. 如果 a i < c , 那就通过速度算出 c − a i 的时间 . 即 b i + 1 − b i a i + 1 − a i ∗ ( c − a i ) 查询某个点在的区间,我们使用二分,然后通过速度算出具体的时间\\ 因为在某段区间为匀速,所以通过速度公式可以算出速度\frac{a_{i+1}-a_i}{b_{i+1}-b{i}}\\ 1.如果二分出来的a_{i}等于c,直接输出b_{i}即可\\ 2.如果a_{i}<c,那就通过速度算出c-a{i}的时间.即\frac{b_{i+1}-b{i}}{a_{i+1}-a_i}*(c-a_{i}) 查询某个点在的区间,我们使用二分,然后通过速度算出具体的时间因为在某段区间为匀速,所以通过速度公式可以算出速度bi+1−biai+1−ai1.如果二分出来的ai等于c,直接输出bi即可2.如果ai<c,那就通过速度算出c−ai的时间.即ai+1−aibi+1−bi∗(c−ai)
代码:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int t,n,k,q;
int main(){
cin >> t;
while(t--){
cin >> n >> k >> q;
vector<ll> a(k+1),b(k+1);
a[0]=0,b[0]=0;
for(int i=1;i<=k;i++) cin >> a[i];
for(int i=1;i<=k;i++) cin >> b[i];
while(q--){
ll c;cin >> c;
int l=-1,r=k+1;
while(l+1!=r){
int mid=l+r>>1;
if(a[mid]<=c) l=mid;
else r=mid;
}
if(a[l]==c){
cout << b[l] << " ";
continue;
}
ll ans=b[l]+(c-a[l])*(b[l+1]-b[l])/(a[l+1]-a[l]);
cout << ans << " ";
}
cout << endl;
}
return 0;
}