求条,样例不过,找不出错
查看原帖
求条,样例不过,找不出错
1285177
H_butterfly_T楼主2025/7/30 19:44
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int, int>
const int N = 1e5 + 10;
int n, m, k, u[N << 1], v[N << 1], fa[N << 1], siz[N << 1];
stack<PII> s;
struct T
{
	int l, r;
	vector<int> e;
}t[N << 2];
int find(int x)
{
	if(x != fa[x]) return find(fa[x]);
	return fa[x];
}
void mg(int x, int y)
{
	x = find(x), y = find(y);
	if(x == y) return;
	if(siz[x] > siz[y]) swap(x, y);
	s.push(PII{x, (siz[x] == siz[y])});
	if(siz[x] == siz[y]) siz[y] ++;
	fa[x] = y;
}
void build(int p, int l, int r)
{
	t[p].l = l, t[p].r = r;
	if(l == r) return;
	int mid = t[p].l + t[p].r >> 1;
	build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
}
void update(int p, int l, int r, int x)
{
	if(l <= t[p].l && t[p].r <= r)
	{
		t[p].e.push_back(x);
		return;
	}
	int mid = t[p].l + t[p].r >> 1;
	if(l <= mid) update(p << 1, l, r, x);
	if(r > mid) update(p << 1 | 1, l, r, x);
}
void dfs(int p, int l, int r)
{
	bool f = 1;
	LL len = s.size();
	for(LL i = 0; i < t[p].e.size(); i ++)
	{
		int id = t[p].e[i];
		int a = find(u[id]), b = find(v[id]);
		if(a == b)
		{
			for(int j = l; j <= r; j ++) puts("No");
			f = 0;
			break;
		}
		mg(a, b + n), mg(a + n, b); 
	}
	if(f)
	{
		int mid = t[p].l + t[p].r >> 1;
		if(l == r) puts("Yes");
		else dfs(p << 1, l, mid), dfs(p << 1 | 1, mid + 1, r);
	}
	while(s.size() > len)
	{
		siz[fa[s.top().first]] -= s.top().second;
		fa[s.top().first] = s.top().first;
		s.pop();
	}
}
int main()
{
	cin >> n >> m >> k;
	build(1, 1, k);
	for(int i = 1; i <= m; i ++)
	{
		int l, r;
		scanf("%d%d%d%d", &u[i], &v[i], &l, &r);
		update(1, l + 1, r, i);
	}
	for(int i = 1; i <= 2 * n; i ++) fa[i] = i, siz[i] = 1;
	dfs(1, 1, k);
	return 0;
}
2025/7/30 19:44
加载中...