求助 hack 数据
查看原帖
求助 hack 数据
90027
fanypcd楼主2022/1/22 11:07

RT,听说是卡按秩合并写假的,但是蒟蒻看不出来哪里假了 qwq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
template <class T> inline void read(T &x)
{
	x = 0;
	int f = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9')
	{
		f |= ch == '-';
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = x * 10 + (ch - 48);
		ch = getchar();
	}
	x = f ? -x : x;
	return;
}
#define N 200005
int n, m, k;
int fa[N], size[N];
pair<int, int> st[N];
int top;
inline int getfa(int x)
{
	while(x != fa[x])
	{
		x = fa[x];
	}
	return x;
}
inline void merge(pair<int, int> x)
{
	int f1 = getfa(x.first), f2 = getfa(x.second);
	if(size[f1] < size[f2])
	{
		swap(f1, f2);
	}
	fa[f2] = f1;
	size[f1] += size[f2];
	st[++top] = make_pair(f1, f2);
	return;
}
inline void delet(pair<int, int> x)
{
	int f1 = x.first, f2 = x.second;
	fa[f2] = f2;
	size[f1] -= size[f2];
	return;
}
vector<pair<int, int>> tree[N << 2];
void update(int root, int l, int r, int L, int R, pair<int, int> v)
{
	if(L <= l && r <= R)
	{
		tree[root].emplace_back(v);
		return;
	}
	int mid = (l + r) >> 1;
	if(L <= mid)
	{
		update(root << 1, l, mid, L, R, v);
	}
	if(mid < R)
	{
		update(root << 1 | 1, mid + 1, r, L, R, v);
	}
	return;
}
void dfs(int root, int l, int r, int ans)
{
	int last = top;
	for(auto x : tree[root])
	{
		if(getfa(x.first) == getfa(x.second) || getfa(x.first + n) == getfa(x.second + n))
		{
			ans = 0;
		}
		merge(make_pair(x.first, x.second + n));
		merge(make_pair(x.first + n, x.second));
	}
	if(l == r)
	{
		if(!ans)
		{
			printf("No\n");
		}
		else
		{
			printf("Yes\n");
		}
	}
	else
	{
		int mid = (l + r) >> 1;
		dfs(root << 1, l, mid, ans), dfs(root << 1 | 1, mid + 1, r, ans);
	}
	while(top != last)
	{
		delet(st[top]);
		top--;
	}
	return;
}
signed main()
{
	read(n), read(m), read(k);
	for(int i = 1; i <= 2 * n; i++)
	{
		fa[i] = i;
		size[i] = 1;
	}
	int u, v, l, r;
	for(int i = 1; i <= m; i++)
	{
		read(u), read(v), read(l), read(r);
		if(u > v)
		{
			swap(u, v);
		}
		if(l == r)
		{
			continue;
		}
		update(1, 1, k, l + 1, r, make_pair(u, v));
	}
	dfs(1, 1, k, 1);
	return 0;
}
2022/1/22 11:07
加载中...