[ABC278D] All Assign Point Add 题解
题目概述:
给出一串数组,进行3种操作,操作1用新元素覆盖数组,操作2给指定元素加入键入的值,操作3输出指定元素的值。
解法:
如果直接暴力模拟,\(O(N^2)\) 肯定会超时发现操作是按时间顺序的,所以可设置一个时间变量进行记录,如果当前操作的时间大于上次操作的时间,就更新,否则不变。使原本的时间复杂度从 \(O(NQ)\) 优化到 \(O(Q)\)。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+100;
struct ele {
int e, t1;
};
ele v[N];
vector<int> t;
signed main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v[i].e;
v[i].t1 = 0;
}
int q, j = 0, tim = 0;
cin >> q;
while (q--) {
j++;
int op, i, k;
cin >> op;
if (op == 1) {
cin >> k;
t.push_back(k);
tim = j;
}
if (op == 2) {
cin >> i >> k;
if (v[i].t1 < tim) v[i].e = t.back() + k;
else v[i].e += k;
v[i].t1 = j;
}
if (op == 3) {
cin >> i;
if (v[i].t1 >= tim) cout << v[i].e << endl;
else cout << t.back() << endl;
}
}
return 0;
}

浙公网安备 33010602011771号