随机输出代码,可能是 delete 假了
查看原帖
随机输出代码,可能是 delete 假了
726525
CuteChat楼主2024/7/15 15:57
#include <bits/stdc++.h>
using namespace std;

int n, o, v, rt, stk[500005], top;
mt19937 rnd(time(0));

struct Info {
	int ls, rs, sz, key, val, sum, res, lmax, rmax, revtg, covtg;
	//           ^              ^   ^    ^     ^
} t[500005];

void setrevtag(int i) {
	if (!i) return;
	(t[i].revtg) ^= 1;
	swap(t[i].ls, t[i].rs);
	swap(t[i].lmax, t[i].rmax);
}
void setcovtag(int i, int tg) {
	if (!i) return;
	(t[i].covtg) = tg;
	(t[i].lmax) = max(0, tg * (t[i].sz));
	(t[i].rmax) = (t[i].lmax);
	(t[i].sum) = tg * (t[i].sz);
	(t[i].res) = (t[i].lmax);
}

void push_down(int i) {
	if (!i) return;
	if (t[i].covtg != 114514) {
		if (t[i].ls) setcovtag(t[i].ls, t[i].covtg);
		if (t[i].rs) setcovtag(t[i].rs, t[i].covtg);
		t[i].covtg = 114514;
	}
	if (t[i].revtg) {
		if (t[i].ls) setrevtag(t[i].ls);
		if (t[i].rs) setrevtag(t[i].rs);
		t[i].revtg = 0;
	}
}
void push_up(int i) {
	push_down(i);
	push_down(t[i].ls);
	push_down(t[i].rs);
	if (!i) return;
	if (t[i].ls && t[i].rs) {
		t[i].lmax = max({t[t[i].ls].lmax, t[t[i].ls].lmax + t[i].val, t[t[i].ls].sum + t[i].val + t[t[i].rs].lmax});
		t[i].rmax = max({t[t[i].rs].rmax, t[t[i].rs].rmax + t[i].val, t[t[i].rs].sum + t[i].val + t[t[i].ls].rmax});
		t[i].res = max({t[t[i].ls].res, t[t[i].rs].res, t[t[i].ls].rmax + t[i].val, t[t[i].ls].rmax + t[i].val + t[t[i].rs].lmax});
		t[i].sz = t[t[i].ls].sz + t[t[i].rs].sz + 1;
		t[i].sum = t[t[i].ls].sum + t[t[i].rs].sum + t[i].val;
	} else if (t[i].rs) {
		t[i].lmax = max({0, t[i].val, t[t[i].rs].lmax + t[i].val});
		t[i].rmax = max(t[t[i].rs].rmax, t[t[i].rs].sum + t[i].val);
		t[i].res = max({t[i].val, t[t[i].rs].res, t[t[i].rs].lmax + t[i].val});
		t[i].sum = t[i].val + t[t[i].rs].sum;
		t[i].sz = t[t[i].rs].sz + 1;
	} else if (t[i].ls) {
		t[i].lmax = max(t[t[i].ls].lmax, t[t[i].ls].sum + t[i].val);
		t[i].rmax = max({0, t[t[i].ls].rmax + t[i].val, t[i].val});
		t[i].res = max({t[i].val, t[t[i].ls].res, t[t[i].ls].rmax + t[i].val}); 
		t[i].sum = t[i].val + t[t[i].ls].sum;
		t[i].sz = t[t[i].ls].sz + 1;
	} else {
		t[i].lmax = max(t[i].val, 0);
		t[i].rmax = max(t[i].val, 0);
		t[i].res = max(t[i].val, 0);
		t[i].sum = t[i].val;
		t[i].sz = 1;
	}
}
int make(int val) {
	/*
	int ls, rs, sz, key, val, sum, res, lmax, rmax, revtg, covtg;
	*/
	if (!top) assert(0);
	int it = stk[top--];
	t[it].sz = 1;
	t[it].key = rnd();
	t[it].sum = val;
	t[it].val = val;
	t[it].rmax = t[it].res = t[it].lmax = max(0, val);
	t[it].revtg = 0;
	t[it].covtg = 114514;
	return it;
}

void split(int u, int x, int &l, int &r) {
	if (!u) return l = r = 0, void();
	push_down(u);
	if (t[t[u].ls].sz < x) {
		l = u;
		split(t[u].rs, x - t[t[u].ls].sz - 1, t[u].rs, r);
	} else {
		r = u;
		split(t[u].ls, x, l, t[u].ls);
	}
	push_up(u);
}
void clear(int i) {
	if (!i) return;
	clear(t[i].ls);
	clear(t[i].rs);
	stk[++top] = i;
	t[i] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}

int merge(int x, int y) {
	if (!x || !y) return x | y;
	if (t[x].key < t[y].key) {
		push_down(x);
		t[x].rs = merge(t[x].rs, y);
		push_up(x);
		return x;
	} else {
		push_down(y);
		t[y].ls = merge(x, t[y].ls);
		push_up(y);
		return y;
	}
}

signed main(signed args, char * argv[]) {
//	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n, m;
	cin >> n >> m;
	for (int i = 500000; i >= 1; --i) stk[++top] = i;
	for (int i = 1; i <= n; ++i) {
		int x; cin >> x;
		rt = merge(rt, make(x));
	}
	string s;
	while (m--) {
		cin >> s;
		if (s == "GET-SUM") {
			int l, k, r, x, y, z;
			cin >> l >> k;
			r = l + k - 1;
			split(rt, l - 1, x, y);
			split(y, r - l + 1, y, z);
			cout << t[y].sum << "\n";
			rt = merge(x, merge(y, z));
		} else if (s == "MAX-SUM") {
			cout << t[rt].res << "\n";
		} else if (s == "INSERT") {
			int pos, tot, u, x, y;
			cin >> pos >> tot;
			split(rt, pos, x, y);
			while (tot--) {
				cin >> u;
				x = merge(x, make(u));
			}
			rt = merge(x, y);
		} else if (s == "DELETE") {
			int l, k, r, x, y, z;
			cin >> l >> k;
			r = l + k - 1;
			split(rt, l - 1, x, y);
			split(y, r - l + 1, y, z);
			clear(y);
			rt = merge(x, z);
		} else if (s == "MAKE-SAME") {
			int l, k, r, c, x, y, z;
			cin >> l >> k >> c;
			r = l + k - 1;
			split(rt, l - 1, x, y);
			split(y, r - l + 1, y, z);
			setcovtag(y, c);
			rt = merge(x, merge(y, z));
		} else if (s == "REVERSE") {
			int l, k, r, x, y, z;
			cin >> l >> k;
			r = l + k - 1;
			split(rt, l - 1, x, y);
			split(y, r - l + 1, y, z);
			setrevtag(y);
			rt = merge(x, merge(y, z));
		} else assert(0);
	}
	return 0;
}

求调

2024/7/15 15:57
加载中...