分析
操作的题永远没有思路。。。这题难就难在不知道如何在O(1)的时间复杂度实现改变整个数组,可以设两个变量k, t,k来表示每次改变整个数组后的值x,t记录每次改变后的第几次查询,设数组b表示第i个元素最近一次改变值是第几次查询·,那么进行第一种操作时只需要判断b[i]是否大于t就可以决定值是多少了。
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n, q;
cin >> n >> q;
vector<ll> a(n);
vector<ll> b(n);
int k;
int t = -1;
ll sum = 0;
for(int i = 0; i< n; i ++) {
cin >> a[i];
sum += a[i];
}
for(int i = 0; i < q; i ++) {
int op;
cin >> op;
if(op == 1) {
int j;
ll x;
cin >> j >> x;
j --;
sum += x - (b[j] > t ? a[j] : k);
b[j] = i;
a[j] = x;
}
else {
ll x;
cin >> x;
sum = n * x;
t = i;
k = x;
}
cout << sum << "\n";
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
T = 1; //cin >> T;
while(T --) {
solve();
}
}