从 ARC069F 贺过来过不了?
查看原帖
从 ARC069F 贺过来过不了?
482610
Mortidesperatslav楼主2025/1/13 15:45
#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<int> G[200005], SCC[200005];
int ig[200005], dfn[200005], low[200005], col[200005], vl[200005];
int a1, a2, cnt, ign, ans, ccnt, tot, id[200005];
bool vis[200005], vvis[200005];
stack<int> s;
queue<int> q;
struct node{
	int id, vl;
}a[200005];
int pirano(int u){
	if (u <= n)
		return u + n;
	else
		return u - n;
}
void build(int u, int l, int r){
	id[u] = ++tot;
	if (l == r){
		G[id[u]].push_back(pirano(a[l].id));
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	G[id[u]].push_back(id[u << 1]);
	G[id[u]].push_back(id[u << 1 | 1]);
}
void RangeLink(int u, int l, int r, int L, int R, int pos){
	if (L > R)
		return;
	if (l > R || r < L)
		return;
	if (L <= l && r <= R){
		G[pos].push_back(id[u]);
		return;
	}
	int mid = (l + r) >> 1;
	RangeLink(u << 1, l, mid, L, R, pos);
	RangeLink(u << 1 | 1, mid + 1, r, L, R, pos);
}
void tarjan(int u){
	dfn[u] = low[u] = ++cnt;
	s.push(u);
	vis[u] = 1;
	for (auto &v : G[u]){
		if (!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}else if (vis[v])
			low[u] = min(low[u], dfn[v]);
	}
	if (dfn[u] == low[u]){
		ccnt++;
		while (!s.empty()){
			int v = s.top();
			s.pop();
			vis[v] = 0;
			col[v] = ccnt;
			SCC[u].push_back(v);
			if (u == v)
				break;
		}
	}
}
int fnd(int x){
	int l = 1, r = (n << 1), ans = -1;
	while (l <= r){
		int mid = (l + r) >> 1;
		if (a[mid].vl > x)
			ans = mid, r = mid - 1;
		else
			l = mid + 1;
	}
	return ans;
}
bool check(int mid){
	memset(dfn, 0, sizeof dfn);
	memset(low, 0, sizeof low);
	memset(col, 0, sizeof col);
	cnt = 0;
	ccnt = 0;
	for (int i = 1; i <= (n << 1); i++)
		G[i].clear();
	tot = (n << 1);
	build(1, 1, n << 1);
	for (int i = 1; i <= 2 * n; i++){
		int ll = fnd(a[i].vl - mid), rr = fnd(a[i].vl + mid - 1) - 1;
		RangeLink(1, 1, n << 1, ll, i - 1, a[i].id);
		RangeLink(1, 1, n << 1, i + 1, rr, a[i].id);
	}
	for (int i = 1; i <= 2 * n; i++)
		if (!dfn[i])
			tarjan(i);
	for (int i = 1; i <= n; i++)
		if (col[i] == col[i + n])
			return 0;
 	return 1;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	while (cin >> n){
		for (int i = 1; i <= n; i++)
			cin >> a[i].vl >> a[i + n].vl;
		for (int i = 1; i <= (n << 1); i++)
			a[i].id = i;
		sort(a + 1, a + 1 + (n << 1), [](node u, node v){return u.vl < v.vl;});
		int l = 0, r = a[n << 1].vl - a[1].vl, ans = 0;
		while (l <= r){
			int mid = (l + r) >> 1;
			if (check(mid))
				ans = mid, l = mid + 1;
			else
				r = mid - 1;
		}
		cout << ans << "\n";
	}
	return 0;
}

为什么啊/kel

2025/1/13 15:45
加载中...