mx求调线段树
查看原帖
mx求调线段树
267481
刘嘉琦楼主2022/8/6 18:35
#include <cstdio>
#include <vector>
#include <algorithm>
using std::vector;
typedef long long LL;

int read() {
	int s = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = s * 10 + ch - 48, ch = getchar();
	return s;
}
void write(int x) {
	if (x > 9)
		write(x / 10);
	putchar(x % 10 + 48);
}

const int MOD = 998244353, vIE = 0, tIE = 0, N = 500005;

struct SegTree {
	int sz;
	vector<LL> val, tag;
	
	void pushdown(int x, int lx, int rx) {
		tag[x << 1] = (tag[x << 1] + tag[x]) % MOD;
		tag[x << 1 | 1] = (tag[x << 1 | 1] + tag[x]) % MOD;
		val[x << 1] = (val[x << 1] + tag[x] * (rx - lx) / 2) % MOD;
		val[x << 1 | 1] = (val[x << 1 | 1] + tag[x] * (rx - lx) / 2) % MOD;
		tag[x] = tIE;
	}
	void pushup(int x) {
		val[x] = (val[x << 1] + val[x << 1 | 1]) % MOD;
	}
	
	void build(int x, int lx, int rx, vector<LL>& a) {
		if (lx + 1 == rx) {
			val[x] = lx <= int(a.size()) ? a[lx - 1] : vIE;
			return ;
		}
		int m = (lx + rx) >> 1;
		build(x << 1, lx, m, a);
		build(x << 1 | 1, m, rx, a);
		pushup(x);
	}
	SegTree() {}
	SegTree(vector<LL>& a) {
		sz = 1;
		while (sz < int(a.size()))
			sz <<= 1;
		val.assign(sz << 1, vIE);
		tag.assign(sz << 1, tIE);
		build(1, 1, sz + 1, a); 
	}
	
	void mdf(int x, int lx, int rx, int l, int r, LL v) {
		if (rx <= l || r <= lx)
			return ;
		if (l <= lx && rx <= r) {
			val[x] = (val[x] + v * (rx - lx)) % MOD;
			tag[x] = (tag[x] + v) % MOD;
			return ;
		} 
		pushdown(x, lx, rx);
		int m = (lx + rx) >> 1;
		mdf(x << 1, lx, m, l, r, v);
		mdf(x << 1 | 1, m, rx, l, r, v);
		pushup(x);
	}
	LL qry(int x, int lx, int rx, int l, int r) {
		if (rx <= l || r <= lx)
			return vIE;
		if (l <= lx && rx <= r)
			return val[x];
		pushdown(x, lx, rx);
		int m = (lx + rx) >> 1;
		return (qry(x << 1, lx, m, l, r) + qry(x << 1 | 1, m, rx, l, r)) % MOD;
	}
} st;

struct Itv {
	int l, r, h;
	friend bool operator<(Itv x, Itv y) {
		return x.h > y.h;
	}
} s[N];
int n, m;
vector<LL> a;

int main()
{
	n = read(), m = read();
	for (int i = 1; i <= m; i++)
		s[i].l = read() + 1, s[i].r = read() + 1, s[i].h = read();
	a.assign(100005, 0);
	for (int i = 1, x; i <= n; i++)
		x = read(), a[x] = 1; 
	st = SegTree(a);
	
	std::sort(s + 1, s + m + 1);
	for (int i = 1; i <= m; i++) {
		int cnt = st.qry(1, 1, st.sz + 1, s[i].l, s[i].r + 1);
		if (s[i].r - s[i].l > 1)
			st.mdf(1, 1, st.sz + 1, s[i].l + 1, s[i].r, 0);
		st.mdf(1, 1, st.sz + 1, s[i].l, s[i].l + 1, cnt);
		st.mdf(1, 1, st.sz + 1, s[i].r, s[i].r + 1, cnt); 
	}
	write(st.qry(1, 1, st.sz + 1, 0, 100002));
	return 0;
}
// plz ac
2022/8/6 18:35
加载中...