WA 70pts 求调
查看原帖
WA 70pts 求调
790188
bsdsdb楼主2024/4/28 18:52
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef int ll;
using namespace std;

const ll MAXN = 2 * 1024 * 1024, inf = 0x3f3f3f3f;

struct TreapNode {
	char val;
	ll l, r, sz, pri;
	TreapNode() {
		l = r = sz = 0;
		val = '\0';
		pri = ~inf;
	}
	TreapNode(char v) {
		l = r = 0;
		sz = 1;
		val = '\0';
		pri = rand();
		val = v;
	}
};
struct Treap {
	ll size = 0, rt = 0;
	TreapNode val[MAXN + 5];
	void upd(ll x) {
		if (x == 0) {
			val[x].sz = 0;
		} else {
			val[x].sz = 1 + val[val[x].l].sz + val[val[x].r].sz;
		}
	}
	void sptrk(ll& x, ll rk, ll& L, ll& R) {
		if (x == 0) {
			L = R = 0;
			return;
		}
		if (val[val[x].l].sz + 1 <= rk) {
			L = x;
			sptrk(val[x].r, rk - (val[val[x].l].sz + 1), val[x].r, R);
		} else {
			R = x;
			sptrk(val[x].l, rk, L, val[x].l);
		}
		upd(x);
	}
	ll mrg(ll L, ll R) {
		if (L == 0 || R == 0) {
			return L + R;
		}
		if (val[L].pri >= val[R].pri) {
			val[L].r = mrg(val[L].r, R);
			upd(L);
			return L;
		} else {
			val[R].l = mrg(L, val[R].l);
			upd(R);
			return R;
		}
	}
	void insert(ll p, string& v) {
		ll L = 0, R = 0;
		sptrk(rt, p, L, R);
		for (char c : v) {
			val[++size] = TreapNode(c);
			L = mrg(L, size);
		}
		rt = mrg(L, R);
	}
	void del(ll p, ll len) {
		ll L = 0, M = 0, R = 0;
		sptrk(rt, p, L, R);
		sptrk(R, len, M, R);
		rt = mrg(L, R);
	}
	void mid(ll x) {
		if (x == 0) {
			return;
		}
		mid(val[x].l);
		cout << val[x].val;
		mid(val[x].r);
	}
	void get(ll p, ll len) {
		ll L = 0, M = 0, R = 0;
		sptrk(rt, p, L, R);
		sptrk(R, len, M, R);
		mid(M);
		rt = mrg(L, mrg(M, R));
	}
} te;

ll T, pnt = 0;

int main() {
	te = Treap();
	cin >> T;
	while (T--) {
		string o;
		ll k;
		cin >> o;
		if (o[0] == 'M') {
			cin >> pnt;
		} else if (o[0] == 'I') {
			cin >> k;
			string s = string();
			for (ll i = 0; i < k; i++) {
				char c;
				do {
					scanf("%c", &c);
				} while (c < 32 || c > 126);
				s += c;
			}
			te.insert(pnt, s);
		} else if (o[0] == 'D') {
			cin >> k;
			te.del(pnt, k);
		} else if (o[0] == 'G') {
			cin >> k;
			te.get(pnt, k);
			cout << endl;
		} else if (o[0] == 'P') {
			pnt--;
		} else if (o[0] == 'N') {
			pnt++;
		}
	}
	return 0;
}
2024/4/28 18:52
加载中...