题解:P9789 [ROIR 2020 Day 2] ATM
题目链接
思路:
设
设
综上所述,
注意到若
查询答案时二分查找到满足
时间复杂度:
因为
所以总时间复杂度是
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
int n,t,b[N],a[N],q,x,f[N],mx[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=2e18;
for(int i=1;i<=n;i++){
if(a[i]+mx[t]<a[i+1]){
b[++t]=a[i];
f[t]=f[t-1]+(a[i+1]-mx[t-1]-1)/b[t];
mx[t]=(a[i+1]-mx[t-1]-1)/b[t]*b[t]+mx[t-1];
}
}
cin>>q;
while(q--){
cin>>x;
int p=upper_bound(b+1,b+t+1,x)-b-1;
x=min(x,mx[p]);
cout<<mx[p-1]+(x-mx[p-1])/b[p]*b[p]<<" "<<f[p-1]+(x-mx[p-1])/b[p]<<"\n";
}
return 0;
}