Submission #546033

# Submission time Handle Problem Language Result Execution time Memory
546033 2022-04-06T04:51:10 Z blue ICC (CEOI16_icc) C++17
100 / 100
228 ms 648 KB
#include "icc.h"
#include <vector>
#include <algorithm>
#include <queue>
#include <iostream>
#include <random>
using namespace std;

using vi = vector<int>;
using vvi = vector<vi>;
#define sz(x) int(x.size())

const int mx = 100;

int getRandom(int a, int b)
{
	return a + (rand() % (b-a+1));
}

int vquery(vi A, vi B)
{
	int a[mx], b[mx];
	for(int ai = 0; ai < sz(A); ai++)
		a[ai] = A[ai];

	for(int bi = 0; bi < sz(B); bi++)
		b[bi] = B[bi];

	if(sz(A) == 0 || sz(B) == 0)
		return 0;

	return query(sz(A), sz(B), a, b);
}

void run(int N)
{
	srand(10);

	vi edge[1+N];

	for(int e = 1; e <= N-1; e++)
	{
		cerr << "\n\n\n\n\n";
		cerr << "e = " << e << '\n';
		vi cc(1+N, -1);
		int ccc = 0;

		for(int i = 1; i <= N; i++)
		{
			if(cc[i] != -1) continue;
			ccc++;

			queue<int> tbv;
			tbv.push(i);

			while(!tbv.empty())
			{
				int u = tbv.front();
				tbv.pop();

				cc[u] = ccc - 1;

				cerr << u << " <> " << ccc << '\n';

				for(int v : edge[u])
				{
					if(cc[v] != -1) continue;
					tbv.push(v);
				}
			}
		}

		for(int i = 1; i <= N; i++) cerr << cc[i] << ' ';
			cerr << '\n';

		int k = 0;
		while((1<<k) < N)
			k++;

		vi bits;
		for(int v = 0; v < k; v++)
			bits.push_back(v);

		for(int t = 0; t < 2'000; t++)
		{
			int p = getRandom(0, k-1);
			int q = getRandom(0, k-1);
			if(getRandom(0, 1))
				swap(bits[p], bits[q]);
		}

		int goodbit;
		vi S[2];

		for(int b : bits)
		{
			vi s[2];
			for(int i = 1; i <= N; i++)
				s[bool(cc[i] & (1<<b))].push_back(i);

			if(b == bits.back() || vquery(s[0], s[1]))
			{
				S[0] = s[0];
				S[1] = s[1];
				break;
			}
		}

		while(sz(S[0]) > 1)
		{
			vi SS[2];
			for(int i = 0; i < sz(S[0])/2; i++)
				SS[0].push_back(S[0][i]);
			for(int i = sz(S[0])/2; i < sz(S[0]); i++)
				SS[1].push_back(S[0][i]);

			if(vquery(SS[0], S[1]))
				S[0] = SS[0];
			else
				S[0] = SS[1];
		}

		while(sz(S[1]) > 1)
		{
			vi SS[2];
			for(int i = 0; i < sz(S[1])/2; i++)
				SS[0].push_back(S[1][i]);
			for(int i = sz(S[1])/2; i < sz(S[1]); i++)
				SS[1].push_back(S[1][i]);

			if(vquery(SS[0], S[0]))
				S[1] = SS[0];
			else
				S[1] = SS[1];
		}
		
		int u = S[0][0], v = S[1][0];
		setRoad(u, v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
}

Compilation message

icc.cpp: In function 'void run(int)':
icc.cpp:92:7: warning: unused variable 'goodbit' [-Wunused-variable]
   92 |   int goodbit;
      |       ^~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 8 ms 468 KB Ok! 98 queries used.
2 Correct 8 ms 496 KB Ok! 99 queries used.
# Verdict Execution time Memory Grader output
1 Correct 51 ms 504 KB Ok! 539 queries used.
2 Correct 58 ms 504 KB Ok! 649 queries used.
3 Correct 59 ms 468 KB Ok! 654 queries used.
# Verdict Execution time Memory Grader output
1 Correct 191 ms 596 KB Ok! 1479 queries used.
2 Correct 212 ms 608 KB Ok! 1590 queries used.
3 Correct 189 ms 548 KB Ok! 1534 queries used.
4 Correct 205 ms 616 KB Ok! 1529 queries used.
# Verdict Execution time Memory Grader output
1 Correct 198 ms 504 KB Ok! 1531 queries used.
2 Correct 198 ms 504 KB Ok! 1516 queries used.
3 Correct 201 ms 588 KB Ok! 1544 queries used.
4 Correct 199 ms 624 KB Ok! 1520 queries used.
# Verdict Execution time Memory Grader output
1 Correct 196 ms 560 KB Ok! 1554 queries used.
2 Correct 193 ms 528 KB Ok! 1543 queries used.
3 Correct 228 ms 584 KB Ok! 1559 queries used.
4 Correct 191 ms 508 KB Ok! 1573 queries used.
5 Correct 188 ms 508 KB Ok! 1535 queries used.
6 Correct 191 ms 508 KB Ok! 1566 queries used.
# Verdict Execution time Memory Grader output
1 Correct 211 ms 648 KB Ok! 1553 queries used.
2 Correct 201 ms 540 KB Ok! 1575 queries used.