线段树满江紫求助(玄关)
查看原帖
线段树满江紫求助(玄关)
674967
xz001楼主2023/12/20 13:45
#include <bits/stdc++.h>

#define int long long 
#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)

using namespace std;

struct tree {
	int t[4 * 50005], mu[4 * 50005], ad[4 * 50005];
	tree() {
		memset(t, 0, sizeof(t));
		memset(mu, 0, sizeof(mu));
		memset(ad, 0, sizeof(ad));
	}
	void push_up (int p) {
		t[p] = t[ls(p)] + t[rs(p)];
	}
	void build (int l, int r, int p) {
		mu[p] = 1;
		if (l == r) return;
		int mid = (l + r) >> 1;
		build (l, mid, ls(p));
		build (mid + 1, r, rs(p));
		return;
	}
	void lazy_tag (int p, int l, int r, int mul, int add) {
		t[p]  *= mul;
		mu[p] *= mul;
		ad[p] *= mul;
		
		t[p]  += (r - l + 1) * add;
		ad[p] += add;
		return;
	}
	void push_down (int p, int l, int r) {
		int mid = (l + r) >> 1;
		lazy_tag (ls(p), l, mid, mu[p], ad[p]);
		lazy_tag (rs(p), mid + 1, r, mu[p], ad[p]);
		mu[p] = 1;
		ad[p] = 0;
		return;
	}
	void update (int L, int R, int l, int r, int p, int mul, int add) {
		if (l <= L && R <= r) {
			lazy_tag (p, l, r, mul, add);
			return;
		}
		push_down(p, L, R);
		int mid = (L + R) >> 1;
		if (l <= mid) update (L, mid, l, r, ls(p), mul, add);
		if (r >  mid) update (mid + 1, R, l, r, rs(p), mul, add);
		push_up(p);
		return;
	}
	int query (int L, int R, int l, int r, int p) {
		if (l <= L && R <= r) {
			return t[p];
		}
		push_down(p, L, R);
		int mid = (L + R) >> 1, sum = 0;
		if (l <= mid) sum += query (L, mid, l, r, ls(p));
		if (r >  mid) sum += query (mid + 1, R, l, r, rs(p));
		return sum;
	}
};

tree t[27];

int n, m;

char s[100005];

signed main() {
	scanf("%lld%lld%s", &n, &m, s + 1);
	for (int i = 0; i < 26; ++ i) t[i].build(1, n, 1); 
	for (int i = 1; i <= n; ++ i) t[s[i] - 'A'].update(1, n, i, i, 1, 1, 1);
	while (m -- ) {
		int op, x, y;
		scanf("%lld%lld%lld", &op, &x, &y);
		if (op == 1) {
			char k[2];
			scanf("%s", k);
			printf("%lld\n", t[k[0] - 'A'].query(1, n, x, y, 1));
		} else if (op == 2) {
			char k[2];
			scanf("%s", k);
			for (int i = 0; i < 26; ++ i) t[i].update(1, n, x, y, 1, 0, 0);
			t[k[0] - 'A'].update(1, n, x, y, 1, 1, 1);  
		} else {
			int cnt[30];
			memset(cnt, 0, sizeof(cnt));
			for (int i = 0; i < 26; ++ i) cnt[i] += t[i].query(1, n, x, y, 1); 
			for (int i = 0; i < 26; ++ i) t[i].update(1, n, x, y, 1, 0, 0);
			for (int i = 0; i < 26; ++ i) {
				t[i].update(1, n, x, x + cnt[i] - 1, 1, 1, 1);
				x += cnt[i]; 
			}
		}
	} 
	return 0;
}


全紫了,求助大佬

2023/12/20 13:45
加载中...