[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;
}

posted @ 2025-07-18 10:06  Tobaa  阅读(4)  评论(0)    收藏  举报