链接
题意:
有n种茶,n个人,第i种茶有 a[i]的量,第i个人一次能喝 b[i], 第i个人从第i种茶开始往前喝,求每个人能喝多少
分析
对于第 i 杯茶,其只会被 i,i+1,i+2,⋯,n 这些人品尝. 可以发现一定是第 i ∼ j个人可以品尝到 b_i∼b_j单位的茶,然后第 j+1个人可以品尝到第 i 杯茶剩下的所有部分,然后再后面的人就没有茶可以品尝了.
对于所有的茶 i ,我们容易通过二分找到 j 的位置,我们可以统计对于每个人k,其品尝到 /b_k 毫升茶多少次,我们发现每次我们都是做一个静态的区间加,可以用差分解决.而对于品尝到所有剩下的茶的情况可以直接暴力加到答案上.总复杂度为O(nlogn).
参考代码:
#include <bits/stdc++.h>
using ll = long long;
const int maxn = 2e5 + 5;
int a[maxn], b[maxn];
ll s[maxn];
ll d[maxn], ans[maxn];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
std::cin >> T;
while (T--) {
int n;
std::cin >> n;
for (in