답안 #369974

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
369974 2021-02-22T20:24:42 Z luciocf Joker (BOI20_joker) C++14
0 / 100
1 ms 364 KB
#include <bits/stdc++.h>

#define ff first
#define ss second

using namespace std;

typedef pair<int, int> pii;

const int maxn = 2e5+10;

struct DSU
{
	int pai[maxn], peso[maxn], edge[maxn];
	bool bp;

	struct RollBack
	{
		int u, v, pu;
		bool b;
	};

	stack<RollBack> stk;

	void init(int n)
	{
		bp = 1;
		for (int i = 1; i <= n; i++)
			pai[i] = i, peso[i] = 1;
	}

	int Find(int x, int &c)
	{
		if (pai[x] == x) return x;

		c ^= edge[x];

		return Find(pai[x], c);
	}

	bool Join(int x, int y)
	{
		int cx = 0, cy = 0;
		x = Find(x, cx), y = Find(y, cy);

		if (peso[x] < peso[y])
		{
			swap(x, y);
			swap(cx, cy);
		}

		stk.push({x, y, peso[x], bp});

		if (x == y) return bp = (bp && (cx != cy));

		pai[y] = x, peso[x] += peso[y];
		edge[y] = cx ^ cy ^ 1;

		return 1;
	}

	void rollback(int x)
	{
		while (stk.size() > x)
		{
			auto E = stk.top(); stk.pop();

			pai[E.u] = E.u, pai[E.v] = E.v;
			peso[E.u] = E.pu, edge[E.v] = 0;
			bp = E.b;
		}
	}
} dsu;

int n, m;

int opt[maxn];
pii edge[maxn];

void solve(int l, int r)
{
	if (l > r) return;

	int mid = (l+r)>>1, s0 = dsu.stk.size();

	for (int i = l; i <= mid; i++)
		dsu.Join(edge[i].ff, edge[i].ss);

	int s1 = dsu.stk.size();

	opt[mid] = mid;

	if (!dsu.bp) opt[mid] = opt[r+1];
	else
	{
		for (int i = opt[r+1]; i >= max(opt[l-1], mid+1); i--)
		{
			if (!dsu.Join(edge[i].ff, edge[i].ss))
			{
				opt[mid] = i;
				break;
			}
		}
	}

	dsu.rollback(s1);
	solve(mid+1, r);

	dsu.rollback(s0);
	for (int i = opt[r+1]; i > opt[mid]; i--)
		dsu.Join(edge[i].ff, edge[i].ss);

	solve(l, mid-1);

	dsu.rollback(s0);
}

int main(void)
{
	int q;
	scanf("%d %d %d", &n, &m, &q);

	for (int i = 1; i <= m; i++)
		scanf("%d %d", &edge[i].ff, &edge[i].ss);

	dsu.init(n);

	opt[0] = 1, opt[m+1] = m;
	solve(1, m);

	while (q--)
	{
		int l, r;
		scanf("%d %d", &l, &r);

		if (opt[l] >= r) printf("YES\n");
		else printf("NO\n");
	}
}

Compilation message

Joker.cpp: In member function 'void DSU::rollback(int)':
Joker.cpp:64:21: warning: comparison of integer expressions of different signedness: 'std::stack<DSU::RollBack>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   64 |   while (stk.size() > x)
      |          ~~~~~~~~~~~^~~
Joker.cpp: In function 'int main()':
Joker.cpp:121:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  121 |  scanf("%d %d %d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:124:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  124 |   scanf("%d %d", &edge[i].ff, &edge[i].ss);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:134:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  134 |   scanf("%d %d", &l, &r);
      |   ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -