线段树分治 100pts 但是 hack 数据 TLE
查看原帖
线段树分治 100pts 但是 hack 数据 TLE
397282
_NTT_楼主2024/1/4 14:48

rt,不知道哪里错了。

#include <bits/stdc++.h>
//#define int long long
#define gcd __gcd
#define il inline
#define pii pair<int, int>
#define fir first
#define sec second
#define pb push_back
#define eb emplace_back
#define file(name) freopen(name".in", "r", stdin); freopen(name".out", "w", stdout);
#define rep(i, l, r) for(int i = (l); i <= (r); ++i)
#define per(i, r, l) for(int i = (r); i >= (l); --i)
using namespace std;

typedef long long ll;

const int N = 2e5 + 10, M = N * 4, mod = 998244353, INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;

int n, m, k, x, y, l, r;

vector<pii> g[M];
#define mid (l + r >> 1)
#define lc(k) (k << 1)
#define rc(k) (k << 1 | 1)

void update(int k, int l, int r, int L, int R) {
	if(l >= L && r <= R) return g[k].pb({x, y});
	if(L <= mid) update(lc(k), l, mid, L, R);
	if(R > mid) update(rc(k), mid + 1, r, L, R);
}

int fa[N], sz[N];
stack<int> s;

il int find(int x) {
	while(x != fa[x]) x = fa[x];
	return x;
}

il void merge(int x, int y) {
//	cout << "merge" << x << ' ' << y << endl;
	if(x == y) return ;
	if(sz[x] > sz[y]) swap(x, y);
	s.push(x);
	fa[x] = y; sz[y] += sz[x];
}

il void del() {
	int x = s.top(); s.pop();
//	cout << "del" << x << ' ' << y << endl;
	sz[fa[x]] -= sz[x]; fa[x] = x;
}

void dfs(int k, int l, int r, bool res = 1) {
//	cout << k << ':' << l << ' ' << r << '=' << res << endl;
	int cnt = s.size();
	for(auto [x, y] : g[k]) {
		int p = find(x), q = find(y);
		res &= (p != q);
//		cout << "q" << x << ' ' << y << ':' << p << ' ' << q << endl;
		merge(p, find(y + n));
		merge(find(x + n), q);
	}
	
	if(l == r) cout << (res ? "Yes\n" : "No\n");
	else dfs(lc(k), l, mid, res), dfs(rc(k), mid + 1, r, res);
	
	while(s.size() > cnt) del();
}

signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n >> m >> k;
	rep(i, 1, 2*n) fa[i] = i, sz[i] = 1;
	rep(i, 1, m) {
		cin >> x >> y >> l >> r;
		if(l != r) update(1, 1, k, l + 1, r);
	}
	
	dfs(1, 1, k);

	return 0;	
}
2024/1/4 14:48
加载中...