萌新求助:用动态开点线段树,但为什么样例都过不了?
查看原帖
萌新求助:用动态开点线段树,但为什么样例都过不了?
763782
zbojin楼主2023/8/19 22:10
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

inline ll read() {
	ll x = 0; bool f = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-') f = 1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + ch - '0';
		ch = getchar();
	}
	return !f ? x : -x;
}

struct Node {
	int ls, rs;
	ll sum, maxn;
};

struct SegmentTree {

	int n, m, opt, l, r, cnt, rt;
	ll v; Node tree[100005 << 4];
	
	void push_up(int p) {
		int ls = tree[p].ls, rs = tree[p].rs;
		tree[p].sum = tree[ls].sum + tree[rs].sum;
		tree[p].maxn = max(tree[ls].maxn, tree[rs].maxn);
	}
	
	void build(int &p, int l, int r) {
		if(!p) p = ++cnt;
		if(l == r) {
			tree[p].sum = tree[p].maxn = read();
			return;
		}
		int mid = (l + r) >> 1;
		build(tree[p].ls, l, mid);
		build(tree[p].rs, mid + 1, r);
		push_up(p);
	}
	
	void update_mod(int p, int nl, int nr, int l, int r, ll P) {
		if(tree[p].maxn < P) return;
		if(nl <= l && r <= nr) {
			tree[p].sum %= P;
			tree[p].maxn %= P;
			return;
		}
		int mid = (l + r) >> 1;
		if(nl <= mid) update_mod(tree[p].ls, nl, nr, l, mid, P);
		if(mid < nr) update_mod(tree[p].rs, nl, nr, mid + 1, r, P);
		push_up(p);
	}
	
	void update(int p, int l, int r, int x, ll v) {
		if(l == r) {
			tree[p].sum = tree[p].maxn = v;
			return;
		}
		int mid = (l + r) >> 1;
		if(x <= mid) update(tree[p].ls, l, mid, x, v);
		else update(tree[p].rs, mid + 1, r, x, v);
		push_up(p);
	}
	
	ll query(int p, int nl, int nr, int l, int r) {
		if(nl <= l && r <= nr) return tree[p].sum;
		int mid = (l + r) >> 1;
		ll ret = 0;
		if(nl <= mid) ret += query(tree[p].ls, nl, nr, l, mid);
		if(mid < nr) ret += query(tree[p].rs, nl, nr, mid + 1, r);
		return ret;
	}
};

SegmentTree T;

int main() {
	T.n = read(); T.m = read();
	T.build(T.rt, 1, T.n);
	while(T.m --) {
		T.opt = read(); T.l = read();
		if(T.opt == 1) {
			T.r = read(); if(T.l > T.r) swap(T.l, T.r);
			printf("%lld\n", T.query(1, T.l, T.r, 1, T.n));
		}
		else if(T.opt == 2) {
			T.r = read(); if(T.l > T.r) swap(T.l, T.r);
			T.v = read();
			T.update_mod(1, T.l, T.r, 1, T.n, T.v);
		}
		else {
			T.v = read();
			T.update(1, 1, T.n, T.l, T.v);
		}
	}
	return 0;
}

部分样例输出是对的,部分是错的,找不到原因,求救

2023/8/19 22:10
加载中...