codeforces 923B 二分+前缀和

传送门

题意

给你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");
}
发布了31 篇原创文章 · 获赞 5 · 访问量 1356

猜你喜欢

转载自blog.csdn.net/qq_43685900/article/details/105084629