Submission #300268

#TimeUsernameProblemLanguageResultExecution timeMemory
300268Elephant52Highway Tolls (IOI18_highway)C++11
Compilation error
0 ms0 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pair<int, int>> vpi;

#define INF 1000000000
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define rep(i,a,b) for (int i = a; i < b; i++)

typedef struct node {
	int vertex, edge, dist;
	node() {};
	node(int a, int b, int c) : vertex(a), edge(b), dist(c) {};
} node;

vpi adj[90000];
vi tree_adj[90000];
vi edge_dist[90000];
bool seen[90000];
int subtree_sizes[90000];
int depth[90000];

void make_spanning_tree(int cur) {
	seen[cur] = 1;
	for (auto p : adj[cur]) {
		int edge = p.F;
		if (!seen[edge]) {
			make_spanning_tree(edge);
			tree_adj[cur].PB(edge);
			tree_adj[edge].PB(cur);
		}
	}
}

void find_sizes(int cur) {
	seen[cur] = 1;
	subtree_sizes[cur] = 1;
	for (auto edge : tree_adj[cur]) {
		if (!seen[edge]) {
			find_sizes(edge);
			subtree_sizes[cur] += subtree_sizes[edge];
		}
	}
}

int find_centroid(int N) {
	find_sizes(0);
	int centroid = 0, largest_subtree, nxt = 0;
	do {
		centroid = nxt;
		largest_subtree = 0;
		for (auto edge : adj[centroid]) {
			if (subtree_sizes[edge.F] > largest_subtree) {
				largest_subtree = subtree_sizes[N];
				nxt = edge.F;
			}	
		}
	} while(largest_subtree >= N/2+1 && N - subtree_sizes[centroid] >= N/2+1);
	return centroid;
}

void find_pair(int N, vi U, vi V, int A, int B) {
	int S, T, dist, M = V.size();
	
	vi w(M, 0); //query edge list
	
	rep(i,0,M) {
		adj[U[i]].emplace_back(V[i], i);
		adj[V[i]].emplace_back(U[i], i);
	}
	
	make_spanning_tree(0);
	memset(seen, 0, sizeof(seen));
	
	queue<pii> bfs;
	bfs.push(MP(find_centroid(N), 1));
	
	int tree_height = 0;
	
	while (!bfs.empty()) {
		pii cur = bfs.front(); bfs.pop(); //vertex, distance
		depth[cur.F] = cur.S;
		tree_height = max(tree_height, cur.S);
		seen[cur.F] = 1;
		
		for (auto edge : adj[cur.F]) {
			edge_dist[cur.S].PB(edge.S);
			if (!seen[edge.F]) bfs.push(MP(edge.F, cur.S));	
		}
	}
	
	assert(A > 0);
	dist = ask(w)/A;
	
	int low = 1, high = tree_height;
	
	while (low < high) {
		int mid = (low + high)/2;
		
		for (int i = tree_height-1; i >= mid; i--) {
			for (auto edge : edge_dist[i]) w[edge] = 1;
		}
		
		int res = ask(w);
		if (res > dist*A) low = mid+1;	
		else high = mid;
		
		memset(&w[0], 0, sizeof(w[0])*M);
	}
	
	int lower_point = low-1; //depth of lower point
	
	low = 0, high = edge_dist[lower_point].size();
	
	while (low < high) {
		int mid = (low + high)/2;
		
		for (int i = 0; i <= mid; i++) w[edge_dist[lower_point][i]] = 1;
		
		int res = ask(w);
		if (res > dist*A) high = mid;	
		else low = mid+1;
		
		memset(&w[0], 0, sizeof(w[0])*M);
	}
	
	S = min(U[edge_dist[lower_point][low]], V[edge_dist[lower_point][low]]);
	if (depth[U[edge_dist[lower_point][low]]] > depth[V[edge_dist[lower_point][low]]]) S = U[edge_dist[lower_point][low]];
	else S = V[edge_dist[lower_point][low]];
	
	queue<node> bfs2;
	
	bfs2.push(node(S, 0, 0));
	
	memset(seen, 0, sizeof(seen));
	while (!bfs2.empty()) {
		auto cur = bfs2.front(); bfs2.pop();
		seen[cur.vertex] = 1;
		if (dist == cur.dist) {
			w[edge] = 1;
			int res = ask(w);
			if (res > dist*A) {
				T = cur.vertex;
				break;
			}
			w[edge] = 0;
		}
		for (auto edge : adj[cur.vertex]) {
			if (!seen[edge.F]) {
				bfs.push(node(edge.F, edge.S, cur.dist+1));
			}
		}
	}
	
	answer(S, T);
}

Compilation message (stderr)

highway.cpp: In function 'void find_pair(int, vi, vi, int, int)':
highway.cpp:148:6: error: 'edge' was not declared in this scope
  148 |    w[edge] = 1;
      |      ^~~~
highway.cpp:158:46: error: no matching function for call to 'std::queue<std::pair<int, int> >::push(node)'
  158 |     bfs.push(node(edge.F, edge.S, cur.dist+1));
      |                                              ^
In file included from /usr/include/c++/9/queue:64,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:86,
                 from highway.cpp:2:
/usr/include/c++/9/bits/stl_queue.h:259:7: note: candidate: 'void std::queue<_Tp, _Sequence>::push(const value_type&) [with _Tp = std::pair<int, int>; _Sequence = std::deque<std::pair<int, int>, std::allocator<std::pair<int, int> > >; std::queue<_Tp, _Sequence>::value_type = std::pair<int, int>]'
  259 |       push(const value_type& __x)
      |       ^~~~
/usr/include/c++/9/bits/stl_queue.h:259:30: note:   no known conversion for argument 1 from 'node' to 'const value_type&' {aka 'const std::pair<int, int>&'}
  259 |       push(const value_type& __x)
      |            ~~~~~~~~~~~~~~~~~~^~~
/usr/include/c++/9/bits/stl_queue.h:264:7: note: candidate: 'void std::queue<_Tp, _Sequence>::push(std::queue<_Tp, _Sequence>::value_type&&) [with _Tp = std::pair<int, int>; _Sequence = std::deque<std::pair<int, int>, std::allocator<std::pair<int, int> > >; std::queue<_Tp, _Sequence>::value_type = std::pair<int, int>]'
  264 |       push(value_type&& __x)
      |       ^~~~
/usr/include/c++/9/bits/stl_queue.h:264:25: note:   no known conversion for argument 1 from 'node' to 'std::queue<std::pair<int, int> >::value_type&&' {aka 'std::pair<int, int>&&'}
  264 |       push(value_type&& __x)
      |            ~~~~~~~~~~~~~^~~