제출 #651608

#제출 시각아이디문제언어결과실행 시간메모리
651608ymm통행료 (IOI18_highway)C++17
51 / 100
339 ms23544 KiB
#include "highway.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;

const int N = 150'010;
int len;
vector<pii> adj0[N];
vector<pii> adj1[N];
int n, m;
ll A, B;
mt19937_64 rd(time(0));

ll ask_edge(vector<int> T)
{
	vector<int> vec(m, 1);
	for (int e : T) {
		vec[e] = 0;
	}
	return ask(vec);
}

ll ask_ver(vector<int> V, int l, int r)
{
	vector<int> vec(m, 1);
	Loop (i,0,n)
		for (auto [_, e] : adj1[i])
			vec[e] = 0;
	Loop (i,l,r)
		for (auto [_, e] : adj1[V[i]])
			vec[e] ^= 1;
	return ask(vec);
}

ll ask_ver(vector<int> V) { return ask_ver(V, 0, V.size()); }

int bin_search(vector<int> V)
{
	int l = 0, r = V.size();
	while (r - l > 1) {
		int mid = (l+r)/2;
		int par = ((ask_ver(V, l, mid) - A*len) / (B - A)) & 1;
		if (par)
			r = mid;
		else
			l = mid;
	}
	return V[l];
}

bool vis[N];
bool bad[N];
void dfs(int v, vector<int> &vec)
{
	vis[v] = 1;
	for (auto [u, _] : adj0[v]) {
		if (bad[u])
			continue;
		vec.push_back(v);
		if (vis[u])
			continue;
		dfs(u, vec);
	}
}

void bfs(int rt, vector<int> &T)
{
	vector<int> vec = {rt};
	vis[rt] = 1;
	for (int i = 0; i < vec.size(); ++i) {
		int v = vec[i];
		for (auto [u, e] : adj0[v]) {
			if (bad[u] || vis[u])
				continue;
			T.push_back(e);
			vis[u] = 1;
			vec.push_back(u);
		}
	}
}

void find_pair(int _N, vector<int> _U, vector<int> _V, int _A, int _B)
{
	n = _N; m = _U.size(); A = _A; B = _B;
	Loop (e,0,m) {
		int v = _V[e], u = _U[e];
		adj0[v].push_back({u, e});
		adj0[u].push_back({v, e});
	}
	vector<int> dard(m);
	iota(dard.begin(), dard.end(), 0);
	len = ask_edge(dard)/A;
	for (;;) {
		vector<int> T, rts;
		memset(vis, 0, sizeof(vis));
		Loop (v,0,n) {
			if (bad[v] || vis[v])
				continue;
			vector<int> vec;
			dfs(v, vec);
			if (vec.size())
				rts.push_back(vec[rd()%vec.size()]);
		}
		memset(vis, 0, sizeof(vis));
		for (int rt : rts)
			bfs(rt, T);
		if (ask_edge(T) == len*A) {
			for (auto e : T) {
				int v = _V[e], u = _U[e];
				adj1[v].push_back({u, e});
				adj1[u].push_back({v, e});
			}
			break;
		}
		for (int rt : rts)
			bad[rt] = 1;
	}
	vector<int> V;
	for (;;) {
		V.clear();
		Loop (i,0,n)
			if (rd()&1)
				V.push_back(i);
		int par = ((ask_ver(V) - A*len) / (B - A)) & 1;
		if (par)
			break;
	}
	int s = bin_search(V);
	V.resize(n);
	iota(V.begin(), V.end(), 0);
	V.erase(V.begin()+s);
	int t = bin_search(V);
	answer(s, t);
}

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

highway.cpp: In function 'void bfs(int, std::vector<int>&)':
highway.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for (int i = 0; i < vec.size(); ++i) {
      |                  ~~^~~~~~~~~~~~
#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...