splay 10pts求助
查看原帖
splay 10pts求助
799782
xiaochen266楼主2024/5/8 22:00

调了一晚了,来个好心人救下

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
struct node {
	int s[2], ms, ls, rs, sum, siz, p, v;
	int same, rev;

	void init(int _v, int _p) {
		s[0] = s[1] = 0;
		p = _p, v = _v;
		siz = 1, sum = ms = v;
		ls = rs = max(v, 0);
	}
} tr[N];
int rt, rbs[N], tt;
int w[N];
int n, m;

#define lc(x) tr[x].s[0]
#define rc(x) tr[x].s[1]

void pushup(int u) {
	tr[u].siz = tr[lc(u)].siz + tr[rc(u)].siz + 1;
	tr[u].sum = tr[lc(u)].sum + tr[rc(u)].sum + tr[u].v;
	tr[u].ls = max(tr[lc(u)].ls, tr[lc(u)].sum + tr[u].v + tr[rc(u)].ls);
	tr[u].rs = max(tr[rc(u)].rs, tr[rc(u)].sum + tr[u].v + tr[lc(u)].rs);
	tr[u].ms = max(max(tr[lc(u)].ms, tr[rc(u)].ms), tr[lc(u)].rs + tr[u].v + tr[rc(u)].ls);
}

void pushdown(int u) {
	if (tr[u].same) {
		tr[u].same = 0, tr[u].rev = 0;
		if (lc(u)) {
			tr[lc(u)].same = 1;
			tr[lc(u)].v = tr[u].v;
			tr[lc(u)].sum = tr[u].v * tr[lc(u)].siz;
		}
		if (rc(u)) {
			tr[rc(u)].same = 1;
			tr[rc(u)].v = tr[u].v;
			tr[rc(u)].sum = tr[u].v * tr[rc(u)].siz;
		}
		if (tr[u].v > 0) {
			if (lc(u))
				tr[lc(u)].ms = tr[lc(u)].rs = tr[lc(u)].ls = tr[lc(u)].sum;
			if (rc(u))
				tr[rc(u)].ms = tr[rc(u)].rs = tr[rc(u)].ls = tr[rc(u)].sum;
		} else {
			if (lc(u))
				tr[lc(u)].ms = tr[u].v, tr[lc(u)].rs = tr[lc(u)].ls = 0;
			if (rc(u))
				tr[rc(u)].ms = tr[u].v, tr[rc(u)].rs = tr[rc(u)].ls = 0;
		}
	} else if (tr[u].rev) {
		tr[u].rev = 0;
		tr[lc(u)].rev ^= 1;
		tr[rc(u)].rev ^= 1;
		swap(tr[lc(u)].ls, tr[lc(u)].rs);
		swap(tr[rc(u)].ls, tr[rc(u)].rs);
		swap(tr[lc(u)].s[0], tr[lc(u)].s[1]);
		swap(tr[rc(u)].s[0], tr[rc(u)].s[1]);
	}
}

void rotate(int x) {
	int y = tr[x].p, z = tr[y].p;
	bool k = tr[y].s[1] == x;
	tr[z].s[tr[z].s[1] == y] = x, tr[x].p = z;
	tr[y].s[k] = tr[x].s[k ^ 1], tr[tr[x].s[k ^ 1]].p = y;
	tr[x].s[k ^ 1] = y, tr[y].p = x;
	pushup(y);
	pushup(x);
}

void splay(int x, int k) {
	while (tr[x].p != k) {
		int y = tr[x].p, z = tr[y].p;
		if (z != k) {
			if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y))
				rotate(x);
			else
				rotate(y);
		}
		rotate(x);
	}
	if (!k)
		rt = x;
}

int get_k(int k) {
	int x = rt;
	while (x) {
		pushdown(x);
		if (tr[lc(x)].siz >= k)
			x = lc(x);
		else if (tr[lc(x)].siz + 1 == k)
			return x;
		else
			k -= tr[lc(x)].siz + 1, x = rc(x);
	}
}

int build(int l, int r, int p) {
	int mid = l + r >> 1;
	int u = rbs[tt--];
	tr[u].init(w[mid], p);
	if (l < mid)
		lc(u) = build(l, mid - 1, u);
	if (r > mid)
		rc(u) = build(mid + 1, r, u);
	pushup(u);
	return u;
}

void rec(int u) {
	if (lc(u))
		rec(lc(u));
	if (rc(u))
		rec(rc(u));
	rbs[++tt] = u;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	for (int i = 1; i < N; i++)
		rbs[++tt] = i;
	cin >> n >> m;
	tr[0].ms = -1e9;
	w[0] = w[n + 1] = -1e9;
	for (int i = 1; i <= n; i++)
		cin >> w[i];
	rt = build(0, n + 1, 0);
	string opt;
	while (m--) {
		cin >> opt;
		if (opt == "INSERT") {
			int posi, tot;
			cin >> posi >> tot;
			for (int i = 0; i < tot; i++)
				cin >> w[i];
			int l = get_k(posi + 1), r = get_k(posi + 2);
			splay(l, 0);
			splay(r, l);
			int u = build(0, tot - 1, r);
			lc(r) = u;
			pushup(r);
			pushup(l);
		} else if (opt == "DELETE") {
			int posi, tot;
			cin >> posi >> tot;
			int l = get_k(posi), r = get_k(posi + tot + 1);
			splay(l, 0);
			splay(r, l);
			rec(lc(r));
			lc(r) = 0;
			pushup(r);
			pushup(l);
		} else if (opt == "MAKE-SAME") {
			int posi, tot, c;
			cin >> posi >> tot >> c;
			int l = get_k(posi), r = get_k(posi + tot + 1);
			splay(l, 0);
			splay(r, l);
			tr[lc(r)].same = 1;
			tr[lc(r)].v = c;
			tr[lc(r)].sum = tr[lc(r)].siz * c;
			if (c > 0)
				tr[lc(r)].ms = tr[lc(r)].ls = tr[lc(r)].rs = tr[lc(r)].sum;
			else
				tr[lc(r)].ms = c, tr[lc(r)].rs = tr[lc(r)].ls = 0;
			pushup(r);
			pushup(l);
		} else if (opt == "REVERSE") {
			int posi, tot;
			cin >> posi >> tot;
			int l = get_k(posi), r = get_k(posi + tot + 1);
			splay(l, 0);
			splay(r, l);
			tr[lc(r)].rev ^= 1;
			swap(lc(lc(r)), rc(lc(r)));
			swap(tr[lc(r)].ls, tr[lc(r)].rs);
			pushup(r);
			pushup(l);
		} else if (opt == "GET-SUM") {
			int posi, tot;
			cin >> posi >> tot;
			int l = get_k(posi), r = get_k(posi + tot + 1);
			splay(l, 0);
			splay(r, l);
			cout << tr[lc(r)].sum << "\n";
		} else
			cout << tr[rt].ms << "\n";
	}
	return 0;
}
2024/5/8 22:00
加载中...