제출 #671966

#제출 시각아이디문제언어결과실행 시간메모리
671966ymm카멜레온의 사랑 (JOI20_chameleon)C++17
100 / 100
50 ms832 KiB
#include "chameleon.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

namespace {

const int maxn = 1024;

vector<int> A[maxn];

int query(vector<int> vec)
{
	for (int &x : vec)
		x += 1;
	return Query(vec);
}

bool bin_query(int v, vector<int> vec, int l, int r)
{
	vector<int> dard = vector<int>(&vec[l], &vec[r]); // UB but whatever
	dard.push_back(v);
	return query(dard) != dard.size();
}

int bin(int v, vector<int> vec)
{
	int l = 0, r = vec.size();
	if (l == r)
		return -1;
	if (!bin_query(v, vec, l, r))
		return -1;
	while (r - l > 1) {
		int m = (l + r)/2;
		if (!bin_query(v, vec, l, m))
			l = m;
		else
			r = m;
	}
	return l;
}


bool vis[maxn];
void dfs(int v, int col, vector<int> vec[2])
{
	vis[v] = 1;
	vec[col].push_back(v);
	for (int u : A[v]) {
		if (!vis[u])
			dfs(u, 1-col, vec);
	}
}

void solve(int v)
{
	if (v == 0)
		return;
	solve(v-1);
	memset(vis, 0, v);
	vector<int> vec[2];
	Loop (u,0,v) {
		if (vis[u])
			continue;
		dfs(u, 0, vec);
	}
	Loop (col, 0, 2) {
		int i;
		while ((i = bin(v, vec[col])) != -1) {
			int u = vec[col][i];
			swap(vec[col][i], vec[col].back());
			vec[col].pop_back();
			A[v].push_back(u);
			A[u].push_back(v);
		}
	}
}

int love[maxn];
int match[maxn];

}  // namespace

void Solve(int N)
{
	solve(2*N-1);
	//Loop (i,0,2*N) {
	//	cerr << i << ": ";
	//	for (int j : A[i])
	//		cerr << j << ' ';
	//	cerr << '\n';
	//}
	memset(love, -1, sizeof(love));
	Loop (v,0,2*N) {
		if (A[v].size() == 1)
			continue;
		assert(A[v].size() == 3);
		int a = A[v][0];
		int b = A[v][1];
		int c = A[v][2];
		//cerr << v << ": " << v << ' ' << a << ' ' << b << ' ' << c << " - " << query({v, a, c}) << '\n';
		if (query({v, a, b}) == 1)
			love[v] = c;
		else if (query({v, a, c}) == 1)
			love[v] = b;
		else
			love[v] = a;
	}
	//Loop (i,0,2*N)
	//	cerr << love[i]+1 << ' ';
	//cerr << '\n';
	Loop (v,0,2*N) {
		if (A[v].size() == 1) {
			match[v] = A[v][0];
			continue;
		}
		int a = A[v][0];
		int b = A[v][1];
		int c = A[v][2];
		if (love[a] != v && love[v] != a)
			match[v] = a;
		else if (love[b] != v && love[v] != b)
			match[v] = b;
		else
			match[v] = c;
	}
	//Loop (i,0,2*N)
	//	cerr << match[i] << ' ';
	//cerr << '\n';
	Loop (i,0,2*N) {
		if (i > match[i])
			continue;
		Answer(i+1, match[i]+1);
	}
}

컴파일 시 표준 에러 (stderr) 메시지

chameleon.cpp: In function 'bool {anonymous}::bin_query(int, std::vector<int>, int, int)':
chameleon.cpp:27:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |  return query(dard) != dard.size();
      |         ~~~~~~~~~~~~^~~~~~~~~~~~~~
chameleon.cpp: In function 'void Solve(int)':
chameleon.cpp:106:14: warning: narrowing conversion of 'v' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
  106 |   if (query({v, a, b}) == 1)
      |              ^
chameleon.cpp:106:14: warning: narrowing conversion of 'v' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
chameleon.cpp:108:19: warning: narrowing conversion of 'v' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
  108 |   else if (query({v, a, c}) == 1)
      |                   ^
chameleon.cpp:108:19: warning: narrowing conversion of 'v' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
#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...