求助卡常
查看原帖
求助卡常
174009
denominator楼主2024/12/9 19:43

RT,LOJ 过了,但是洛谷在链中,n5×105n\leq 5\times10^5 的数据挂得不成样子……

#include <bits/stdc++.h>
using namespace std;
const int N = 500010, LOGN = 25;
int n, q, ql[N], qr[N], qk[N], qp[N], qans[N], dep[N], lg2[N], fa[LOGN][N], a[N], sl[N << 1], sr[N << 1], sk[N << 1], sp[N << 1], cnt;
map <int, int> tmp;
set < pair <int, int> > s;
vector <int> ops[N], ins[N];
inline int read () {
	int x = 0;
	char ch = getchar_unlocked ();
	while (ch < 48 || ch > 57) {
		ch = getchar_unlocked ();
	}
	while (ch >= 48 && ch <= 57) {
		x = (x << 3) + (x << 1) + (ch ^ '0');
		ch = getchar_unlocked ();
	}
	return x;
}
namespace gf {
	int h[N], c;
	struct node {
		int nxt, to;
	} a[N << 1];
	inline void add (int u, int v) {
		a[++c].nxt = h[u];
		a[c].to = v;
		h[u] = c;
		a[++c].nxt = h[v];
		a[c].to = u;
		h[v] = c;
	}
}
inline void dfs (int u, int fat) {
	for (int i = gf::h[u]; i != 0; i = gf::a[i].nxt) {
		int v = gf::a[i].to;
		if (v == fat) {
			continue;
		}
		dep[v] = dep[u] + 1;
		fa[0][v] = u;
		dfs (v, u);
	}
}
struct segtree {
	int dat[N << 2];
	inline void modify (int p, int l, int r, int qp, int qx) {
		if (l == r) {
			dat[p] = max (dat[p], qx);
			return ;
		}
		int mid = (l + r) >> 1;
		if (qp <= mid) {
			modify (p << 1, l, mid, qp, qx);
		} else {
			modify (p << 1 | 1, mid + 1, r, qp, qx);
		}
		dat[p] = max (dat[p << 1], dat[p << 1 | 1]);
	}
	inline int query (int p, int l, int r, int ql, int qr) {
		if (ql <= l && r <= qr) {
			return dat[p];
		}
		int mid = (l + r) >> 1, ans = 0;
		if (ql <= mid) {
			ans = max (ans, query (p << 1, l, mid, ql, qr));
		}
		if (qr > mid) {
			ans = max (ans, query (p << 1 | 1, mid + 1, r, ql, qr));
		}
		return ans;
	}
} T[3];
int main () {
	// freopen ("query.in", "r", stdin);
	// freopen ("query.out", "w", stdout);
	n = read ();
	for (int i = 1; i < n; ++i) {
		int u, v;
		u = read (), v = read ();
		gf::add (u, v);
	}
	q = read ();
	for (int i = 1; i <= q; ++i) {
		ql[i] = read (), qr[i] = read (), qk[i] = read ();
		qp[i] = i;
	}
	dep[1] = 1;
	dfs (1, -1);
	ins[1].push_back (1);
	for (int i = 2; i <= n; ++i) {
		ins[dep[i]].push_back (i);
		lg2[i] = lg2[i >> 1] + 1;
	}
	for (int p = 1; p <= lg2[n]; ++p) {
		for (int i = 1; i <= n; ++i) {
			fa[p][i] = fa[p - 1][fa[p - 1][i]];
		}
	}
	for (int i = 1; i < n; ++i) {
		int u = i, v = i + 1;
		if (dep[u] < dep[v]) {
			swap (u, v);
		}
		for (int p = lg2[n]; p >= 0; --p) {
			if (dep[fa[p][u]] >= dep[v]) {
				u = fa[p][u];
			}
		}
		if (u == v) {
			a[i] = dep[u];
		} else {
			for (int p = lg2[n]; p >= 0; --p) {
				if (fa[p][u] != fa[p][v]) {
					u = fa[p][u];
					v = fa[p][v];
				}
			}
			a[i] = dep[u] - 1;
		}
		ops[a[i]].push_back (i);
	}
	for (int i = n; i >= 1; --i) {
		if (ins[i].empty ()) {
			continue;
		}
		sort (ins[i].begin (), ins[i].end ());
		sort (ops[i].begin (), ops[i].end ());
		for (auto j : ins[i]) {
			s.insert (make_pair (j, j));
			tmp[j] = j;
		}
		for (auto j : ops[i]) {
			auto t1 = s.lower_bound (make_pair (j + 1, 0));
			auto t2 = t1--;
			if (tmp.count (t2 -> first)) {
				tmp.erase (t2 -> first);
			}
			pair <int, int> ret = make_pair (t1 -> first, t2 -> second);
			tmp[t1 -> first] = t2 -> second;
			s.erase (t1), s.erase (t2), s.insert (ret);
		}
		for (auto j : tmp) {
			sl[++cnt] = j.first, sr[cnt] = j.second, sk[cnt] = i;
		}
		tmp.clear ();
	}
	for (int i = 1; i <= cnt; ++i) {
		sp[i] = i;
	}
	sort (qp + 1, qp + q + 1, [] (int x, int y) { return qk[x] > qk[y]; });
	sort (sp + 1, sp + cnt + 1, [] (int x, int y) { return sr[x] - sl[x] > sr[y] - sl[y]; });
	for (int i = n, j1 = 1, j2 = 1; i >= 1; --i) {
		for (; j1 <= cnt && sr[sp[j1]] - sl[sp[j1]] + 1 == i; j1++) {
			T[0].modify (1, 1, n, sl[sp[j1]], sk[sp[j1]]);
			T[1].modify (1, 1, n, sr[sp[j1]], sk[sp[j1]]);
		}
		for (; j2 <= q && qk[qp[j2]] == i; j2++) {
			qans[qp[j2]] = max (qans[qp[j2]], T[0].query (1, 1, n, ql[qp[j2]], qr[qp[j2]] - i + 1));
			qans[qp[j2]] = max (qans[qp[j2]], T[1].query (1, 1, n, ql[qp[j2]] + i - 1, qr[qp[j2]]));
		}
	}
	sort (qp + 1, qp + q + 1, [] (int x, int y) { return qr[x] > qr[y]; });
	sort (sp + 1, sp + cnt + 1, [] (int x, int y) { return sr[x] > sr[y]; });
	for (int i = n, j1 = 1, j2 = 1; i >= 1; --i) {
		for (; j1 <= cnt && sr[sp[j1]] == i; j1++) {
			T[2].modify (1, 1, n, sl[sp[j1]], sk[sp[j1]]);
		}
		for (; j2 <= q && qr[qp[j2]] == i; j2++) {
			qans[qp[j2]] = max (qans[qp[j2]], T[2].query (1, 1, n, 1, ql[qp[j2]]));
		}
	}
	for (int i = 1; i <= q; ++i) {
		printf ("%d\n", qans[i]);
	}
	return 0;
}
2024/12/9 19:43
加载中...