Submission #1106899

# Submission time Handle Problem Language Result Execution time Memory
1106899 2024-10-31T08:59:10 Z thieunguyenhuy Highway Tolls (IOI18_highway) C++17
18 / 100
143 ms 33608 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, dep[N], e[N];
vii adj[N];
vector<int> ve[N];

#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) {
	assert(++asked <= 60);
	return ask(w);
}

void dfs(int u, int fa) {
	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;

	for (int i = 1; i < n; ++i) ve[i].clear();
	dep[0] = 0; dfs(0, -1); 

	int low = 1, high = n - 1, 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 = ve[depthT].size() - 1; int posT = -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 = 1, high = depthT; int depthS = 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 = (depthS = mid) - 1;
		else low = mid + 1;
	}

	// cerr << "depthS = " << depthS << '\n';
	// for (auto &x : ve[depthS]) cerr << x << ' ';
	// cerr << '\n';

	low = 0, high = ve[depthS].size() - 1; int posS = -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:149:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  149 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
highway.cpp:159:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  159 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
highway.cpp:171:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  171 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
highway.cpp:185:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  185 |   int mid = low + high >> 1; vector<int> w(m, HEAVY);
      |             ~~~~^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 4688 KB Output is correct
2 Correct 2 ms 4688 KB Output is correct
3 Correct 1 ms 4688 KB Output is correct
4 Correct 1 ms 4688 KB Output is correct
5 Correct 1 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 2 ms 4688 KB Output is correct
9 Correct 2 ms 4860 KB Output is correct
10 Correct 2 ms 4688 KB Output is correct
11 Correct 1 ms 4688 KB Output is correct
12 Correct 2 ms 4688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4688 KB Output is correct
2 Correct 11 ms 5444 KB Output is correct
3 Correct 101 ms 11592 KB Output is correct
4 Correct 109 ms 11512 KB Output is correct
5 Correct 109 ms 11632 KB Output is correct
6 Correct 127 ms 11700 KB Output is correct
7 Correct 126 ms 11644 KB Output is correct
8 Correct 103 ms 12364 KB Output is correct
9 Correct 102 ms 11828 KB Output is correct
10 Correct 117 ms 11556 KB Output is correct
11 Correct 116 ms 13476 KB Output is correct
12 Correct 143 ms 14788 KB Output is correct
13 Correct 107 ms 13788 KB Output is correct
14 Correct 114 ms 13988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6480 KB Output is correct
2 Correct 22 ms 8268 KB Output is correct
3 Correct 34 ms 10512 KB Output is correct
4 Correct 101 ms 21580 KB Output is correct
5 Correct 98 ms 21580 KB Output is correct
6 Correct 102 ms 21576 KB Output is correct
7 Correct 96 ms 21704 KB Output is correct
8 Correct 95 ms 21576 KB Output is correct
9 Correct 120 ms 21576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4688 KB Output is correct
2 Correct 13 ms 5496 KB Output is correct
3 Correct 73 ms 10056 KB Output is correct
4 Correct 99 ms 11488 KB Output is correct
5 Correct 101 ms 11412 KB Output is correct
6 Correct 95 ms 11588 KB Output is correct
7 Correct 100 ms 11532 KB Output is correct
8 Correct 102 ms 11388 KB Output is correct
9 Correct 113 ms 11524 KB Output is correct
10 Correct 114 ms 11720 KB Output is correct
11 Runtime error 133 ms 26388 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 70 ms 33608 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 69 ms 33608 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -