TLE&WA求调
查看原帖
TLE&WA求调
790188
bsdsdb楼主2024/4/25 22:13

下载了#1的数据,本地测试没问题,但是交上去#2没输出其余全TLE

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
typedef long long ll;
using namespace std;

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

ll readll() {
	ll r = 0;
	char c;
	do {
		c = getchar();
	} while (c < '0' || c > '9');
	while ('0' <= c && c <= '9') {
		r = (r << 3) + (r << 1) + c - '0';
		c = getchar();
	}
	return r;
}
void printll(ll x) {
	ll revx = 0;
	while (x) {
		revx = (revx << 3) + (revx << 1) + x % 10;
		x /= 10;
	}
	if (revx == 0) {
		putchar('0');
		return;
	}
	while (revx) {
		putchar(revx % 10 + '0');
		revx /= 10;
	}
}
string readstr() {
	string r;
	char c;
	do {
		c = getchar();
	} while (!(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')));
	while (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
		r += c;
		c = getchar();
	}
	return r;
}
void printstr(string x) {
	for (char c : x) {
		putchar(c);
	}
}

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

ll T, pnt = 0;

int main() {
	// freopen("1.in", "r", stdin);
	// freopen("1.out", "w", stdout);
	// auto st = clock();
	T = readll();
	while (T--) {
		string o;
		ll k;
		o = readstr();
		if (o[0] == 'M') {
			pnt = readll();
		} else if (o[0] == 'I') {
			k = readll();
			string s;
			for (ll i = 0; i < k; i++) {
				char c;
				do {
					c = getchar();
				} while (c < 32 || c > 126);
				s += c;
			}
			te.insert(pnt, s);
		} else if (o[0] == 'D') {
			k = readll();
			te.del(pnt, k);
		} else if (o[0] == 'G') {
			k = readll();
			printstr(te.get(pnt, k));
			putchar('\n');
		} else if (o[0] == 'P') {
			pnt--;
		} else if (o[0] == 'N') {
			pnt++;
		}
	}
	// for (ll i = 1; i <= 3; i++) {
	// 	putchar('l'), putchar(' '), printll(te.val[i].l), putchar(' '), putchar('r'), putchar(' '), printll(te.val[i].r), putchar(' '), putchar('v'), putchar(' '), putchar(te.val[i].val), putchar(' '), putchar('p'), putchar(' '), printll(te.val[i].pri), putchar(' '), putchar('s'), putchar(' '), printll(te.val[i].sz), putchar('\n'); 
	// }
	// auto ed = clock();
	// printll((ed - st) * 1000 / CLOCKS_PER_SEC);
	return 0;
}
2024/4/25 22:13
加载中...