有没有大佬,帮忙看看,第二个点过不去
查看原帖
有没有大佬,帮忙看看,第二个点过不去
609811
accccccc楼主2022/6/15 15:44
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <ctime>
#include <queue>
#include <algorithm>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5+10;
/*
  n个元素,进行q次操作
  1: 单点修改
  2: 所有元素改为x 
*/
ll a[N];
int n, q;
struct tree {
	int l, r;
	ll tag, sum;
}t[N<<2]; 
int lc(int k) {
	return (k << 1);
}
int rc(int k) {
	return (k << 1 | 1);
}
inline void push_up(int k) {
	t[k].sum = t[lc(k)].sum + t[rc(k)].sum;
}
inline void push_down(int k, int len) {
	if(t[k].tag != LLONG_MIN) {
		t[lc(k)].tag = t[k].tag;
		t[rc(k)].tag = t[k].tag;
		t[lc(k)].sum = (len - len / 2) * t[k].tag;
		t[rc(k)].sum = (len / 2) * t[k].tag;
		
		t[k].tag = LLONG_MIN; //恢复 
	}
}
inline void buildTree(int k, int l, int r) {
	t[k].l = l; t[k].r = r; t[k].sum = 0;
	t[k].tag = LLONG_MIN;
	if(l == r) {
		t[k].sum = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	buildTree(lc(k), l, mid);
	buildTree(rc(k), mid+1, r);
	push_up(k);
}
ll query(int k, int l, int r) {
	if(t[k].l >= l && t[k].r <= r) {
		return t[k].sum;
	}
	int mid = (t[k].l + t[k].r) >> 1;
	ll res = 0;
	push_down(k, (t[k].r - t[k].l + 1));
	if(l <= mid)
		res += query(lc(k), l, r);
	if(r > mid)
		res += query(rc(k), l, r);
	push_up(k);
	return res;
}
inline void update1(int k, int x, int z) {
	t[k].sum = t[k].sum - a[x] + z;
	if(t[k].l >= x && t[k].r <= x) {
		a[x] = z;
		return;
	}
	int mid = (t[k].l + t[k].r) >> 1;
	if(x <= mid)
		update1(lc(k), x, z);
	if(x > mid)
		update1(rc(k), x, z);
}
inline void update2(int k, int l, int r, int z) {
	if(t[k].l >= l && t[k].r <= r) {
		t[k].sum = (t[k].r - t[k].l + 1) * z; 
		t[k].tag = z;
		return;
	}
	push_down(k, (t[k].r - t[k].l + 1));
	int mid = (t[k].l + t[k].r) >> 1;
	if(l <= mid)
		update2(lc(k), l, r, z);
	if(r > mid)
		update2(rc(k), l, r, z);
	push_up(k);
}
int main() {
	ios::sync_with_stdio(false);  cin.tie(0);
	cin >> n >> q;
	for(int i = 1; i <= n; ++i)
		cin >> a[i];
	buildTree(1, 1, n);
	while(q--) {
		int p;
		cin >> p;
		if(p == 1) {
			int x, z;
			cin >> x >> z;
//			a[x] = z;
//			buildTree(1,1,n);
			//区间求和 - 线段树 
			update2(1,x,x,z);
		} else {
			int x;
			cin >> x;
//			fill(a+1, a+1+n, x);
//			buildTree(1,1,n);
			//区间求和 
			update2(1,1,n,x);
		}
		cout << query(1,1,n) << endl;
	}
	return 0;
}  
2022/6/15 15:44
加载中...