题目描述
数组 a 有 n 个元素,需要进行 q 次操作。
操作1:将第 i 号元素改为 x
操作2:将数组中所有元素改为 x
每次操作完成后,输出当前数组中所有元素的总和。
输入格式
第一行两个整数 n,q
第二行 n 个整数,表示 a 中的元素
接下来有 q 行,首先输入一个整数 t
若 t==1,接着输入两个整数 i,x
若 t==2,接着输入一个整数 x
输出格式
共 q 行,每行一个整数,表示当前数组 a 中所有元素的和
思路
用 t[x] 和 T 分别记录对 a[x] 操作 和 对所有元素操作 的时间,避免进行操作 2 时修改整个集合,降低时间复杂度
AC代码
#include<iostream>
using namespace std;
#define ll long long
const int N=2e5+10;
int a[N],t[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,q,k,x,y,cun,T=-1;
ll sum=0;
cin>>n>>q;
for(int i=1;i<=n;++i) cin>>a[i],sum+=a[i];
for(int i=1;i<=q;++i)
{
cin>>k>>x;
if(k==1)
{
cin>>y;
sum+=y-(t[x]>T?a[x]:cun);
t[x]=i,a[x]=y;
}
else cun=x,T=i,sum=(ll)n*x;
cout<<sum<<'\n';
}
}