답안 #1106926

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1106926 2024-10-31T09:16:49 Z thieunguyenhuy 통행료 (IOI18_highway) C++17
51 / 100
146 ms 35628 KB
#ifndef hwe
	#include "highway.h"
#endif
 
#include <bits/stdc++.h>
using namespace std;
 
#define popcount(n) (__builtin_popcountll((n)))
#define clz(n) (__builtin_clzll((n)))
#define ctz(n) (__builtin_ctzll((n)))
#define lg(n) (63 - __builtin_clzll((n)))
#define BIT(n, i) (((n) >> (i)) & 1ll)
#define MASK(i) (1ll << (i))
#define FLIP(n, i) ((n) ^ (1ll << (i)))
#define ON(n, i) ((n) | MASK(i))
#define OFF(n, i) ((n) & ~MASK(i))
 
#define Int __int128
#define fi first
#define se second
 
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef pair<long long, int> pli;
typedef pair<int, long long> pil;
typedef vector<pair<int, int>> vii;
typedef vector<pair<long long, long long>> vll;
typedef vector<pair<long long, int>> vli;
typedef vector<pair<int, long long>> vil;
 
template <class T1, class T2>
bool maximize(T1 &x, T2 y) {
    if (x < y) {
        x = y;
        return true;
    }
    return false;
}
template <class T1, class T2>
bool minimize(T1 &x, T2 y) {
    if (x > y) {
        x = y;
        return true;
    }
    return false;
}
 
template <class T>
void remove_duplicate(vector<T> &ve) {
    sort (ve.begin(), ve.end());
    ve.resize(unique(ve.begin(), ve.end()) - ve.begin());
}
 
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
template <class T> T random(T l, T r) {
    return uniform_int_distribution<T>(l, r)(rng);
}
template <class T> T random(T r) {
    return rng() % r;
}
 
const int N = 90000 + 5;
const int MOD = 1e9 + 7;
const int inf = 1e9;
const ll INF = 1e18;
 
const int LIGHT = 0, HEAVY = 1;
 
int asked = 0, maxDepth, dep[N], e[N];
vii adj[N];
vector<int> ve[N];
map<vector<int>, ll> mem;
 
#ifdef hwe
namespace Grader {
	int n, m, s, t;
	ll dist[N];
	pii edges[N];
	vii adj[N];
	vector<int> w;
 
	void get() {
		cin >> n >> m >> s >> t;
	
		for (int i = 0; i < m; ++i) {
			int u, v; cin >> u >> v;
			adj[u].emplace_back(v, i), adj[v].emplace_back(u, i);
			edges[i] = make_pair(u, v);
		}
	}
 
	ll dijkstra(int s, int t) {
		memset(dist, 0x0f, sizeof dist); dist[s] = 0;
		priority_queue<pli, vli, greater<pli>> pq; pq.emplace(0, s);
		while (!pq.empty()) {
			int u = pq.top().se; pq.pop();
			// cerr << "dijkstra " << u << ' ' << dist[u] << '\n';
			for (auto [v, id] : adj[u]) if (minimize(dist[v], dist[u] + w[id])) {
				pq.emplace(dist[v], v);
			}
		}
		return dist[t];
	}
 
	ll ask(const vector<int> &_w) {
		w = _w; for (auto &x : w) ++x;
		return dijkstra(s, t);
	}
}
 
ll ask(const vector<int> &w) {
	return Grader::ask(w);
}
 
void answer(int s, int t) {
	cerr << "Answer " << s << ' ' << t << '\n';
}
#endif
 
ll myask(const vector<int> &w) {
	auto it = mem.find(w);
	if (it != mem.end()) return it->se;
	assert(++asked <= 60);
	return mem[w] = ask(w);
}
 
void dfs(int u, int fa) {
	maximize(maxDepth, dep[u]);
	for (auto [v, id] : adj[u]) if (v != fa) {
		dep[v] = dep[u] + 1, e[v] = id;
		ve[dep[v]].emplace_back(v);
		dfs(v, u);
	}
}
 
void find_pair(int n, vector<int> U, vector<int> V, int A, int B) {
	int m = U.size(); asked = 0;
	for (int i = 0; i < m; ++i) {
		adj[U[i]].emplace_back(V[i], i), adj[V[i]].emplace_back(U[i], i);
	}
 
	vector<int> w(m, LIGHT);
	ll fixed = myask(w); int numEdges = fixed / A, depthS = numEdges;
 
	for (int i = 1; i < n; ++i) ve[i].clear();
	dep[0] = maxDepth = 0; dfs(0, -1); 
 
	int low = 1, high = maxDepth, depthT = 0;
	while (low <= high) {
		int mid = low + high >> 1; vector<int> w(m, HEAVY);
		for (int d = 1; d <= mid; ++d) for (auto v : ve[d]) {
			w[e[v]] = LIGHT;
		}
		if (myask(w) == fixed) high = (depthT = mid) - 1;
		else low = mid + 1;
	}
 
	low = 0, high = int(ve[depthT].size()) - 2; int posT = ve[depthT].size() - 1;
	while (low <= high) {
		int mid = low + high >> 1; vector<int> w(m, HEAVY);
		for (int i = 0; i <= mid; ++i) w[e[ve[depthT][i]]] = LIGHT;
		if (myask(w) < 1ll * numEdges * B) high = (posT = mid) - 1;
		else low = mid + 1;
	}
	int T = ve[depthT][posT];

	for (int i = 1; i < n; ++i) ve[i].clear();
	dep[T] = 0; dfs(T, -1); 
 
	low = 0, high = int(ve[depthS].size()) - 2; int posS = ve[depthS].size() - 1;
	while (low <= high) {
		int mid = low + high >> 1; vector<int> w(m, HEAVY);
		for (int i = 0; i <= mid; ++i) w[e[ve[depthS][i]]] = LIGHT;
		// cerr << mid << ' ' << myask(w) << '\n';
		if (myask(w) < 1ll * numEdges * B) high = (posS = mid) - 1;
		else low = mid + 1;
	}
	int S = ve[depthS][posS];
 
	answer(S, T);
}
 
#ifdef hwe
signed main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
 
    #ifdef hwe
        freopen("input.inp", "r", stdin);
        freopen("output.out", "w", stdout);
    #else
        #define taskname ""
        if (fopen(taskname".inp", "r")) {
            freopen(taskname".inp", "r", stdin);
            freopen(taskname".out", "w", stdout);
        }
    #endif
 
    Grader::get();
    int n = Grader::n; vector<int> U, V;
    for (int i = 0; i < Grader::m; ++i) {
    	int u, v; tie(u, v) = Grader::edges[i];
    	U.emplace_back(u), V.emplace_back(v);
    }
    find_pair(n, U, V, 1, 2);
 
    cerr << '\n'; return 0;
}
#endif

Compilation message

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:153:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  153 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
highway.cpp:163:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  163 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
highway.cpp:175:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  175 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4688 KB Output is correct
2 Correct 1 ms 4688 KB Output is correct
3 Correct 2 ms 4688 KB Output is correct
4 Correct 2 ms 4688 KB Output is correct
5 Correct 2 ms 4688 KB Output is correct
6 Correct 2 ms 4688 KB Output is correct
7 Correct 2 ms 4688 KB Output is correct
8 Correct 1 ms 4688 KB Output is correct
9 Correct 2 ms 4688 KB Output is correct
10 Correct 2 ms 4688 KB Output is correct
11 Correct 2 ms 4688 KB Output is correct
12 Correct 1 ms 4688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4688 KB Output is correct
2 Correct 11 ms 6324 KB Output is correct
3 Correct 120 ms 22948 KB Output is correct
4 Correct 119 ms 22684 KB Output is correct
5 Correct 111 ms 22848 KB Output is correct
6 Correct 123 ms 21452 KB Output is correct
7 Correct 100 ms 22952 KB Output is correct
8 Correct 110 ms 21944 KB Output is correct
9 Correct 97 ms 21968 KB Output is correct
10 Correct 110 ms 22544 KB Output is correct
11 Correct 108 ms 20764 KB Output is correct
12 Correct 128 ms 22096 KB Output is correct
13 Correct 107 ms 20324 KB Output is correct
14 Correct 110 ms 20504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 6992 KB Output is correct
2 Correct 22 ms 9752 KB Output is correct
3 Correct 39 ms 12104 KB Output is correct
4 Correct 101 ms 28200 KB Output is correct
5 Correct 97 ms 28096 KB Output is correct
6 Correct 108 ms 27804 KB Output is correct
7 Correct 124 ms 28464 KB Output is correct
8 Correct 98 ms 27720 KB Output is correct
9 Correct 108 ms 28448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4688 KB Output is correct
2 Correct 15 ms 6668 KB Output is correct
3 Correct 75 ms 16412 KB Output is correct
4 Correct 102 ms 21504 KB Output is correct
5 Correct 95 ms 19496 KB Output is correct
6 Correct 104 ms 20784 KB Output is correct
7 Correct 117 ms 18576 KB Output is correct
8 Correct 103 ms 20304 KB Output is correct
9 Correct 122 ms 23712 KB Output is correct
10 Correct 112 ms 23532 KB Output is correct
11 Correct 137 ms 21360 KB Output is correct
12 Correct 115 ms 20948 KB Output is correct
13 Correct 137 ms 19908 KB Output is correct
14 Correct 142 ms 21188 KB Output is correct
15 Correct 123 ms 20092 KB Output is correct
16 Correct 115 ms 18332 KB Output is correct
17 Correct 132 ms 21620 KB Output is correct
18 Correct 110 ms 21740 KB Output is correct
19 Correct 107 ms 19768 KB Output is correct
20 Correct 123 ms 22824 KB Output is correct
21 Correct 113 ms 23704 KB Output is correct
22 Correct 134 ms 23632 KB Output is correct
23 Correct 124 ms 25824 KB Output is correct
24 Correct 128 ms 28224 KB Output is correct
25 Correct 146 ms 35628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 78 ms 33612 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 66 ms 33608 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -