专栏文章

Sum of Min Query题解

AT_abc420_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio5a3fx
此快照首次捕获于
2025/12/02 13:35
3 个月前
此快照最后确认于
2025/12/02 13:35
3 个月前
查看原文

题目大意

给定数组 A    BA\;\;B ,并进行 QQ 次操作。
对于每次操作,若第一个值为 A 则将 axa_{x} 替换为 yy
反之将 axa_{x} 替换为 yy
并统计,对于每一次操作min(ai,bi)\sum{\min(a_i,b_i)}的值。

解题思路

首先计算一下时间预期复杂度~~(内存 1 GB,根本不带怕)~~
若每次循环时都要遍历一遍 min(ai,bi)\sum\min(a_i,b_i),则时间复杂度为 O(nq)
该方法遍历次数为 (2×105)2(2\times10^{5})^2 ,约为 4×10104\times10^{10} 次,铁定超时。
于是我们要思考另一种办法。
考虑到每一次操作只会改变一个值,因此我们只需要定义一个 Res ,输入时累加初值,并在每一次操作中更新他并输出即可,时间复杂度为 O(n+q) 。其中 nn 的复杂度在于输入,而 qq 的复杂度在于查询、更新与输出。

参考代码

附上参考代码
CPP
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[200010],b[200010],v[200010],Res;
int main()
{
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
		scanf("%lld",&b[i]),
		Res+=min(a[i],b[i]);
	while(q--)
	{
		char c;
		long long x,y;
		cin>>c>>x>>y;
		long long qq=min(a[x],b[x]);
		if(c=='A')
			a[x]=y;
		else
			b[x]=y;
		Res-=qq-min(a[x],b[x]);
		printf("%lld\n",Res);
	}
	return 0;
}
最后提醒一句,十年OI一场空,不开long long见祖宗
至少我在考场上见祖宗了

评论

0 条评论,欢迎与作者交流。

正在加载评论...