why TLE on #12
查看原帖
why TLE on #12
790188
bsdsdb楼主2024/6/23 11:46
#include <bits/stdc++.h>
typedef int ll;
using namespace std;

const ll inf = 1e9 + 10, MAXN = 42e6;

struct sec {
	ll val, l, r;
	sec(ll v, ll lf, ll rg) {
		val = v;
		l = lf;
		r = rg;
	}
	sec() {
		val = l = r = 0;
	}
};
struct opr {
	ll val;
	opr(ll v) {
		val = v;
	}
	opr() {
		val = inf;
	}
};
struct segTree {
	ll rt[MAXN];
	sec val[MAXN];
	opr tag[MAXN];
	ll size, rc;
	void pushdown(ll x) {
		if (tag[x].val > 1e9) {
			return;
		}
		tag[val[x].l].val = tag[x].val;
		val[val[x].l].val = tag[val[x].l].val;
		tag[val[x].r].val = tag[x].val;
		val[val[x].r].val = tag[val[x].r].val;
		tag[x] = tag[0] = opr();
		val[0] = sec();
	}
	void pushup(ll x) {
		val[x].val = 0;
	}
	segTree() {
		rt[0] = 1;
		val[0] = sec();
		tag[0] = opr();
		val[1] = sec();
		tag[1] = opr();
		size = 1;
		rc = 0;
	}
	ll clone(ll x) {
		ll nn = ++size;
		val[nn] = sec(val[x].val, val[x].l, val[x].r);
		tag[nn] = opr();
		return nn;
	}
	ll mdf(ll x, ll lx, ll rx, ll l, ll r, ll k, bool isrt = 0) {
		if (r <= lx || rx <= l) {
			return x;
		}
		x = clone(x);
		if (isrt) {
			rt[++rc] = x;
		}
		if (l <= lx && rx <= r) {
			tag[x].val = val[x].val = k;
			return x;
		}
		pushdown(x);
		ll mid = (lx + rx) / 2;
		ll lc = mdf(val[x].l, lx, mid, l, r, k);
		val[x].l = lc;
		ll rc = mdf(val[x].r, mid, rx, l, r, k);
		val[x].r = rc;
		pushup(x);
		return x;
	}
	pair<ll, ll> qry(ll x, ll lx, ll rx, ll l, ll r, bool isrt = 0) {
		if (r <= lx || rx <= l) {
			return make_pair(x, 0);
		}
		x = clone(x);
		if (isrt) {
			rt[++rc] = x;
		}
		if (l <= lx && rx <= r) {
			return make_pair(x, val[x].val);
		}
		pushdown(x);
		ll mid = (lx + rx) / 2, ret = 0;
		auto lq = qry(val[x].l, lx, mid, l, r);
		val[x].l = lq.first;
		ret += lq.second;
		auto rq = qry(val[x].r, mid, rx, l, r);
		val[x].r = rq.first;
		ret += rq.second;
		return make_pair(x, ret);
	}
	void out() {
		cerr << "rts: ";
		for (ll i = 0; i <= rc; i++) {
			cerr << rt[i] << " ";
		}
		cerr << endl;
		for (ll i = 1; i <= size; i++) {
			cerr << i << " val: " << val[i].val << " l: " << val[i].l << " r: " << val[i].r << " tag: " << tag[i].val << endl;
		}
		cerr << "--------------------------------------------------------------------" << endl;
	}
} st;

ll n, q;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin >> n >> q;
	for (ll i = 1, v; i <= n; i++) {
		// st.out();
		cin >> v;
		st.mdf(st.rt[i - 1], 1, n + 1, i, i + 1, v, 1);
	}
	while (q--) {
		// st.out();
		ll ver, o, l, v;
		cin >> ver >> o >> l;
		if (o == 1) {
			cin >> v;
			st.mdf(st.rt[ver + n], 1, n + 1, l, l + 1, v, 1);
		} else {
			cout << st.qry(st.rt[ver + n], 1, n + 1, l, l + 1, 1).second << endl;
		}
	}
	// st.out();
	return 0;
}

MAXN已经小到极限了,41.9e6都会RE on #2(link)

2024/6/23 11:46
加载中...