답안 #799352

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
799352 2023-07-31T13:13:10 Z NothingXD 통행료 (IOI18_highway) C++17
51 / 100
165 ms 13652 KB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef double ld;
typedef complex<ld> point;

void debug_out(){cerr << endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T){
	cerr << H << ' ';
	debug_out(T...);
}

#define debug(...) cerr << "(" << #__VA_ARGS__ << "): ", debug_out(__VA_ARGS__)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define MP(x, y) make_pair(x, y)

const int maxn = 2e5 + 10;

int n, m, h[maxn], par[maxn], st[maxn], ver[maxn], tme, edge[maxn][2], cnt;
vector<int> g[maxn];
bool mark[maxn];

void bfs(int V){
	memset(h, -1, sizeof h);
	memset(par, -1, sizeof par);
	memset(mark, true, sizeof mark);
	queue<int> q;
	q.push(V);
	tme = 0;
	h[V] = 0;
	st[V] = 0;
	par[V] = -1;
	ver[0] = V;
	while(!q.empty()){
		int v = q.front();	
		//debug(v, h[v], par[v], st[v], ver[st[v]]);
		q.pop();
		for (auto x: g[v]){
			int u = edge[x][0]^edge[x][1]^v;
			if (h[u] == -1){
				h[u] = h[v] + 1;
				par[u] = x;
				st[u] = ++tme;
				ver[tme] = u;
				mark[x] = false;
				q.push(u);
			}
		}
	}
	assert(tme == n-1);
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
	n = N;
	m = U.size();
	for (int i = 0; i < m; i++){
		edge[i][0] = U[i];
		edge[i][1] = V[i];
		g[U[i]].push_back(i);
		g[V[i]].push_back(i);
	}

	vector<int> q(m, 0);
	ll dis = ask(q);
	int l = -1, r = n-1;
	while(l + 1 < r){
		vector<int> q(m, 0);
		int mid = (l + r) >> 1;
		for (int i = 0; i < n; i++){
			for (auto x: g[i]){
				q[x] = 1;
			}
		}
		if (ask(q) == dis) l = mid;
		else r = mid;
	}
//	debug(r);
	bfs(r);
//	for (int i = 0; i < m; i++) debug(i, mark[i]);
	l = 0, r = n;
	while(l + 1 < r){
		vector<int> q(m, 0);
		int mid = (l + r) >> 1;
	//	debug(mid);
		for (int i = 0; i < m; i++) q[i] = mark[i];
		for (int i = mid; i < n; i++){
			q[par[ver[i]]] = 1;
		}
	//	for (int i = 0; i < m; i++) debug(i, q[i]);
		if (ask(q) == dis) r = mid;
		else l = mid;
	}
	int S = ver[l];
	bfs(S);
//	debug(S);
//	for (int i = 0; i < m; i++) debug(i, mark[i]);
	l = 0, r = n;
	while(l + 1 < r){
		vector<int> q(m, 0);
		int mid = (l + r) >> 1;
	//	debug(mid);
		for (int i = 0; i < m; i++) q[i] = mark[i];
		for (int i = mid; i < n; i++){
			q[par[ver[i]]] = 1;
		}
		//for (int i = 0; i < m; i++) debug(i, q[i]);
		if (ask(q) == dis) r = mid;
		else l = mid;
	}
	//debug(ver[l]);
	answer(S, ver[l]);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6684 KB Output is correct
2 Correct 3 ms 6676 KB Output is correct
3 Correct 3 ms 6736 KB Output is correct
4 Correct 3 ms 6736 KB Output is correct
5 Correct 3 ms 6736 KB Output is correct
6 Correct 3 ms 6684 KB Output is correct
7 Correct 3 ms 6680 KB Output is correct
8 Correct 3 ms 6736 KB Output is correct
9 Correct 3 ms 6736 KB Output is correct
10 Correct 3 ms 6736 KB Output is correct
11 Correct 3 ms 6676 KB Output is correct
12 Correct 3 ms 6736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 6784 KB Output is correct
2 Correct 14 ms 7412 KB Output is correct
3 Correct 129 ms 13256 KB Output is correct
4 Correct 113 ms 13372 KB Output is correct
5 Correct 165 ms 13256 KB Output is correct
6 Correct 125 ms 13252 KB Output is correct
7 Correct 123 ms 13264 KB Output is correct
8 Correct 125 ms 13368 KB Output is correct
9 Correct 156 ms 13268 KB Output is correct
10 Correct 123 ms 13328 KB Output is correct
11 Correct 116 ms 13112 KB Output is correct
12 Correct 151 ms 13344 KB Output is correct
13 Correct 127 ms 13112 KB Output is correct
14 Correct 125 ms 13096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7376 KB Output is correct
2 Correct 28 ms 8172 KB Output is correct
3 Correct 36 ms 8868 KB Output is correct
4 Correct 71 ms 13108 KB Output is correct
5 Correct 102 ms 13116 KB Output is correct
6 Correct 101 ms 13104 KB Output is correct
7 Correct 91 ms 13112 KB Output is correct
8 Correct 73 ms 13144 KB Output is correct
9 Correct 72 ms 13120 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 6736 KB Output is correct
2 Correct 14 ms 7376 KB Output is correct
3 Correct 107 ms 11828 KB Output is correct
4 Correct 101 ms 13236 KB Output is correct
5 Correct 135 ms 13252 KB Output is correct
6 Correct 143 ms 13356 KB Output is correct
7 Correct 100 ms 13268 KB Output is correct
8 Correct 145 ms 13244 KB Output is correct
9 Correct 113 ms 13252 KB Output is correct
10 Correct 104 ms 13304 KB Output is correct
11 Correct 99 ms 13148 KB Output is correct
12 Correct 103 ms 13112 KB Output is correct
13 Correct 108 ms 13376 KB Output is correct
14 Correct 146 ms 13124 KB Output is correct
15 Correct 131 ms 13304 KB Output is correct
16 Correct 134 ms 13260 KB Output is correct
17 Correct 104 ms 13144 KB Output is correct
18 Correct 115 ms 13116 KB Output is correct
19 Correct 96 ms 13320 KB Output is correct
20 Correct 100 ms 13120 KB Output is correct
21 Correct 103 ms 13496 KB Output is correct
22 Correct 90 ms 13488 KB Output is correct
23 Correct 108 ms 13652 KB Output is correct
24 Correct 126 ms 13612 KB Output is correct
25 Correct 101 ms 13180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 14 ms 7504 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 7468 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -