题意
给你n v[]->每天多出一个雪堆的体积 t[i]->每天每个雪堆融化的体积 问:每天融化的总雪量
思路
对t[]求pre,对于每天多出的每个雪堆(i)二分查找从第i天往后倒那一天融化完全,k[]记录在第pos天半融化的量,kk[]标记(差分的思想),然后输出注意LL。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int MaxN = 1e5 + 5;
typedef long long LL;
const int mod = 1e9 + 7;
int n;
LL v[MaxN],t[MaxN],pre[MaxN];
LL k[MaxN],kk[MaxN];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n; i++) scanf("%lld",&v[i]);
for(int i = 1;i <= n; i++){
scanf("%lld",&t[i]);
pre[i] = pre[i - 1] + t[i];
}
for(int i = 1;i <= n; i++){
LL Q = v[i] + pre[i - 1];
int pos = upper_bound(pre,pre + 1 + n,Q) - pre;
k[pos] += v[i] - pre[pos - 1] + pre[i - 1];
kk[i]++;
kk[pos]--;
// cout << v[i] + pre[i - 1] <<"@" << pre[pos] << endl;
// cout << i << ":"<<pos <<"!\n";
}
for(int i = 1;i <= n; i++) kk[i] = kk[i] + kk[i - 1];
for(int i = 1;i <= n; i++){
// cout << kk[i] << "##" << k[i] << endl;
printf("%lld ",kk[i] * t[i] + k[i]);
}
printf("\n");
}