列表

详情


NC221057. Compute'sOCD

描述

我们知道 Compute 喜欢收集人物卡,他在某个游戏里也收集(氪金)了很多角色,每张人物卡都有一个属性值。但是因为他有 OCD(强迫症),所以他希望他拥有的卡的属性值全是相同的。

幸运的是,他可以通过氪金改变角色的属性。他可以花费 A 使某个角色属性值 +1 ,也可以花费 B 使某个角色属性值 -1 。他可以对同一个角色多次氪金。

Compute 是顺序得到角色的,因此他想知道对每一个 i ,使前 i 张卡属性值全部相同的最少花费是多少。

需要注意的是,每一轮询问是独立的,即在某一轮使用的最少花费策略不必沿用至下一轮中。

输入描述

第一行有三个整数 n, A, B  分别表示 Compute 获得的人物卡的数量,氪金使属性 +1 和 -1 所需要的花费。

接下来一行有 n 个整数 ,分别表示 Compute 获得的每张卡的属性值 x_i

输出描述

输出 n 行,第 i 行输出一个整数代表 Compute 使前 i 张人物卡属性相同的最少花费。

示例1

输入:

5 3 2
5 1 4 2 3

输出:

0
8
11
13
15

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 48ms, 内存消耗: 2752K, 提交时间: 2022-03-05 16:43:28

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int> L;
priority_queue<int, vector<int>, greater<int> > R;
int n,ma,mb;
long long s,lsum,rsum;
int main()
{
	scanf("%d%d%d",&n,&ma,&mb);
	scanf("%d",&s); printf("0\n");
	lsum=rsum=0;
	for (int i=2; i<=n; i++)
	{
		int x; scanf("%d",&x);
		if (x<=s) L.push(x),lsum+=x; else R.push(x),rsum+=x;
		while ((L.size()+1)*ma<R.size()*mb) lsum+=s,L.push(s),s=R.top(),rsum-=s,R.pop();
		while (L.size()*ma>(R.size()+1)*mb) rsum+=s,R.push(s),s=L.top(),lsum-=s,L.pop();
		long long ans=(s*L.size()-lsum)*ma+(rsum-s*R.size())*mb;
		printf("%lld\n",ans);
	}
	return 0;
}

上一题