제출 #1321167

#제출 시각아이디문제언어결과실행 시간메모리
1321167tryharderforioi100Pictionary (COCI18_pictionary)C++20
140 / 140
156 ms26056 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
ll p[100005], siz[100005], ranking[100005];
void reset(ll n)
{
	ll i;
	for(i = 1; i <= n; i++)
	{
		p[i] = i;
		siz[i] = 1;
		ranking[i] = 0;
	}
}
ll parent(ll v)
{
	if(p[v] == v)
	{
		return v;
	}
	return p[v] = parent(p[v]);
}
void merge(ll u, ll v)
{
	ll x = parent(u);
	ll y = parent(v);
	if(x == y)
	{
		return;
	}
	if(ranking[x] > ranking[y])
	{
		p[y] = x;
		siz[x] += siz[y];
	}
	else
	{
		p[x] = y;
		siz[y] += siz[x];
		if(ranking[x] == ranking[y])
		{
			ranking[y]++;
		}
	}
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	ll t = 1;
	//cin >> t;
	while(t--)
	{
		ll n, m, q;
		cin >> n >> m >> q;
		ll a[q + 1], b[q + 1], l[q + 1], r[q + 1], i;
		for(i = 1; i <= q; i++)
		{
			cin >> a[i] >> b[i];
			l[i] = 1;
			r[i] = m;
		}
		reset(n);
		vector<ll>cand[m + 1];
		while(true)
		{
			//cout << "?" << endl;
			bool ischange = false;
			for(i = 1; i <= q; i++)
			{
				if(l[i] != r[i])
				{
					ischange = true;
					//cout << i << " " << l[i] << " " << r[i] << endl;
					ll mid = (l[i] + r[i]) / 2;
					cand[mid].push_back(i);
				}
			}
			if(ischange == false)
			{
				break;
			}
			for(i = 1; i <= m; i++)
			{
				ll j;
				ll rielval = m - i + 1;
				//cout << rielval << endl;
				for(j = rielval * 2; j <= n; j += rielval)
				{
					merge(rielval, j);
				}
				if(cand[i].size() == 0)
				{
					continue;
				}
				while(cand[i].size() != 0)
				{	
					ll idx = cand[i].back();
					//cout << i << " " << idx << endl;
					cand[i].pop_back();
					ll x = parent(a[idx]), y = parent(b[idx]);
					if(x == y)
					{
						r[idx] = i;
					}
					else
					{
						l[idx] = i + 1;
					}
				}
			}
			reset(n);
		}
		for(i = 1; i <= q; i++)
		{
			cout << r[i] << endl;
		}
		cout << endl;
	}
	#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
	#endif
	return 0;
}
// Author: tryharderforioi100

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...