求调
查看原帖
求调
109114
_l_l_¯l¯l¯楼主2022/8/10 12:15

rt 代码十分友善

#include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;
const int MAXN = 10005;
const int MAXNd = 100005;
const int MAXEg = 1000005;
struct edge {int from, to, nxt;} edges[MAXEg]; int head[MAXNd], tot;
int n;
void add(int u, int v) {edges[++tot].to = v; edges[tot].from = u; edges[tot].nxt = head[u]; head[u] = tot;}
void clear() {for (int i = 1; i < MAXNd; i++) head[i] = 0; tot = 0;}
void print() {for (int i = 1; i <= tot; i++) printf("%d %d\n", edges[i].from, edges[i].to);}
namespace scc {
	int sccid[MAXNd], dfn[MAXNd], low[MAXNd], tim, idtot; stack<int> stk; bool instack[MAXNd];
	void dfs(int u) {
		stk.push(u); dfn[u] = low[u] = ++tim; instack[u] = 1;
		for (int i = head[u]; i; i = edges[i].nxt) {
			if (dfn[edges[i].to] == 0) dfs(edges[i].to), low[u] = min(low[u], low[edges[i].to]);
			else if (instack[edges[i].to]) low[u] = min(low[u], dfn[edges[i].to]);
		}
		if (dfn[u] == low[u]) {++idtot; int y; do {
			y = stk.top(); stk.pop(); instack[y] = 0; sccid[y] = idtot;
		} while (y != u); }
	}
	void main() {
		tim = 0; idtot = 0;
		for (int i = 1; i < MAXNd; i++) dfn[i] = low[i] = 0;
		for (int i = 1; i < MAXNd; i++) if (dfn[i] == 0) dfs(i);
	}
}
pair<int, int*> cors[MAXN << 1]; int corsn[MAXN << 1]; pair<int, int> chs[MAXN]; int ano[MAXN];
namespace sgt {
	int build(int rt, int l, int r) {
		if (l == r) return add(rt + (n << 1), ano[l]), rt + (n << 1); int mid = (l + r) >> 1; add(rt + (n << 1), build(rt << 1, l, mid)); add(rt + (n << 1), build(rt << 1 | 1, mid + 1, r)); return rt + (n << 1);
	}
	// int getid(int rt, int l, int r, int u) {
	// 	if (l == r) return rt + (n << 1); int mid = (l + r) >> 1; if (u <= mid) return getid(rt << 1, l, mid, u); else return getid(rt << 1 | 1, mid + 1, r, u);
	// }
	void conn(int rt, int l, int r, int u, int v, int w) {
		// printf("%d %d %d %d %d %d\n", rt, l, r, u, v, w);
		if (u <= l && r <= v) return add(w, rt + (n << 1)), void(); int mid = (l + r) >> 1; if (u <= mid) conn(rt << 1, l, mid, u, v, w); if (v > mid) conn(rt << 1 | 1, mid + 1, r, u, v, w);
	}
}
bool check(int mid) {
	clear(); sgt::build(1, 1, n << 1); for (int i = 1; i <= n << 1; i++) {
		int ll = lower_bound(corsn + 1, corsn + (n << 1) + 1, corsn[i] - mid) - corsn;
		int rr = upper_bound(corsn + 1, corsn + (n << 1) + 1, corsn[i] + mid) - corsn - 1;
		// if (ll > 1) sgt::conn(1, 1, n << 1, 1, ll - 1, i);
		// if (rr < n << 1) sgt::conn(1, 1, n << 1, rr + 1, n, i);
		// printf("%d %d : %d %d(%d)\n", ll, rr, corsn[ll], corsn[rr], corsn[i]);
		// sgt::conn(1, 1, n << 1, ll, rr, i);
		if (ll < i) sgt::conn(1, 1, n << 1, ll, i - 1, i);
		if (rr > i) sgt::conn(1, 1, n << 1, i + 1, rr, i);
	}
	scc::main(); for (int i = 1; i <= n; i++) {
		if (scc::sccid[chs[i].first] == scc::sccid[chs[i].second]) return 0;
	}
	return 1;
}
namespace binsearch {
	int main() {
		int l = -1, r = 1145141919;
		while (l + 1 < r) {
			// printf("%d %d\n", l, r);
			int mid = (l + r) >> 1; if (check(mid)) l = mid; else r = mid;
		}
		return r;
	}
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d %d", &chs[i].first, &chs[i].second), cors[(i << 1) - 1] = make_pair(chs[i].first, &chs[i].first), cors[i << 1] = make_pair(chs[i].second, &chs[i].second);
	sort(cors + 1, cors + (n << 1) + 1);
	for (int i = 1; i <= n << 1; i++) *(cors[i].second) = i, corsn[i] = cors[i].first/*, printf("%d\n", i)*/;
	for (int i = 1; i <= n; i++) ano[chs[i].first] = chs[i].second, ano[chs[i].second] = chs[i].first;
	// printf("%d", check(4));
	// print();
	// for (int i = 1; i <= 19; i++) printf("%d %d\n", i, scc::sccid[i]);
	printf("%d\n", binsearch::main());
	return 0;
}
2022/8/10 12:15
加载中...