답안 #1065319

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1065319 2024-08-19T06:19:14 Z Gromp15 봉쇄 시간 (IOI23_closing) C++17
18 / 100
87 ms 53048 KB
#include <bits/stdc++.h>
#include "closing.h"
#define ar array
#define ll long long
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
using namespace std;
template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

const ll INF = 1e18;
const int is[]{0, 0, 1};

int max_score(int n, int X, int Y, long long K,
              std::vector<int> U, std::vector<int> V, std::vector<int> W) {
	vector<vector<ar<int, 2>>> adj(n+1);
	for (int i = 0; i < n-1; i++) {
		adj[U[i]].push_back({V[i], W[i]});
		adj[V[i]].push_back({U[i], W[i]});
	}
	vector<vector<ll>> d(2, vector<ll>(n, INF));
	vector<int> p(n, -1);
	auto dfs = [&](auto&& s, int v, vector<ll>& dist) -> void {
		for (auto [u, w] : adj[v]) if (u != p[v]) {
			p[u] = v, dist[u] = dist[v] + w;
			s(s, u, dist);
		}
	};
	d[0][X] = 0, d[1][Y] = 0;
	dfs(dfs, X, d[0]);
	fill(all(p), -1);
	dfs(dfs, Y, d[1]);
	vector<int> pth;
	for (int x = X; x != Y; x = p[x]) pth.emplace_back(x);
	pth.emplace_back(Y);
	const int N = sz(pth);
	vector<bool> inpath(N);
	for (int x : pth) inpath[x] = 1;
	int ans = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			vector<ll> dist(n);
			vector<int> who(n), allowed(n);
			for (int k = 0; k <= i; k++) { 
				ckmax(dist[pth[k]], d[0][pth[k]]);
				who[pth[k]] |= 1;
			}
			for (int k = j; k < N; k++) { 
				ckmax(dist[pth[k]], d[1][pth[k]]);
				who[pth[k]] |= 2;
			}
			ll used = 0;
			for (int v : pth) { 
				used += dist[v];
				if (used > K) break;
			}
			if (used > K) continue;
			set<ar<ll, 3>> q;
			set<ar<ll, 2>> q2;
			for (int v : pth) for (int z = 0; z < 2; z++) if (who[v] >> z & 1) {
				for (auto [u, w] : adj[v]) if (!inpath[u] && !(allowed[u] >> z & 1)) {
					allowed[u] |= 1 << z;
				}
			}
			for (int u = 0; u < n; u++) if (!inpath[u]) {
				if (allowed[u] == 3) {
					q2.insert({max(d[0][u], d[1][u]), u});
				}
				for (int i = 0; i < 2; i++) if (allowed[u] >> i & 1) {
					q.insert({d[i][u], u, i});
				}
			}
			while (q.size()) {
				auto [cost, v, k] = *q.begin();
				assert(!(who[v] >> k & 1));
				ll nxt = q.size() > 1 ? (*next(q.begin()))[0] : INF;
				/*
				cout << "Q\n";
				for (auto x : q) cout << x[0] << " " << x[1] << " " << x[2] << endl;
				cout << "Q2\n";
				for (auto x : q2) cout << x[0] << " " << x[1] << '\n';
				*/
				if (q2.size() && (*q2.begin())[0] <= cost + nxt) {
					//if (i == 1 && j == 0) cerr << "HI " << (*q2.begin())[0] << " " << (*q2.begin())[1] << '\n';
					auto [cost2, v2] = *q2.begin();
					if (used + cost2 > K) {
						goto after;
					}
					q2.erase(q2.begin());
					used += cost2;
					assert(!who[v2]);
					assert(allowed[v2] == 3);
					for (int i = 0; i < 2; i++) {
						assert(q.count({d[i][v2], v2, i}));
						q.erase({d[i][v2], v2, i});
					}
					who[v2] = 3;
					for (auto [u, w] : adj[v2]) for (int z = 0; z < 2; z++) if (!inpath[u] && !(allowed[u] >> z & 1)) {
						allowed[u] |= 1 << z;
						if (allowed[u] == 3) {
							assert(who[u] < 3);
							if (!who[u]) q2.insert({max(d[0][u], d[1][u]), u}), q.insert({d[z][u], u, z});
							else {
								int at = is[who[u]];
								assert(d[at][u] >= d[!at][u]);
								q.insert({d[at][u] - d[!at][u], u, at});
							}
						}
						else q.insert({d[z][u], u, z});
					}
					continue;
				}
after:;
				if (used + cost > K) break;
				//if (i == 1 && j == 0) cerr << "USED " << v << " " << k << '\n';
				q.erase(q.begin());
				used += cost;
				who[v] |= 1 << k;
				if (allowed[v] == 3) {
					if (who[v] < 3) {
						assert(q2.count({max(d[0][v], d[1][v]), v}));
						q2.erase({max(d[0][v], d[1][v]), v});
					}
					if (who[v] == 3) {
						assert(!q.count({d[k][v], v, k}));
					}
					else {
						assert(q.count({d[!k][v], v, !k}));
						q.erase({d[!k][v], v, !k});
						assert(d[!k][v] >= d[k][v]);
						q.insert({d[!k][v] - d[k][v], v, !k});
					}
				}
				assert(!inpath[v]);
				for (auto [u, w] : adj[v]) for (int z = 0; z < 2; z++) if ((who[v] >> z & 1) && !inpath[u] && !(allowed[u] >> z & 1)) {
					allowed[u] |= 1 << z;
					if (allowed[u] == 3) {
						assert(who[u] < 3);
						if (!who[u]) q2.insert({max(d[0][u], d[1][u]), u}), q.insert({d[z][u], u, z});
						else {
							int at = is[who[u]];
							assert(d[at][u] <= d[!at][u]);
							q.insert({d[!at][u] - d[at][u], u, !at});
						}
					}
					else q.insert({d[z][u], u, z});
				}
			}
			int cur = 0;
			for (int x : who) cur += __builtin_popcount(x);
			ckmax(ans, cur);
		}
	}
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 87 ms 53048 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 344 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 7 ms 348 KB Output is correct
15 Correct 0 ms 432 KB Output is correct
16 Correct 4 ms 344 KB Output is correct
17 Correct 5 ms 348 KB Output is correct
18 Incorrect 2 ms 348 KB 22nd lines differ - on the 1st token, expected: '29', found: '28'
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 344 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 7 ms 348 KB Output is correct
15 Correct 0 ms 432 KB Output is correct
16 Correct 4 ms 344 KB Output is correct
17 Correct 5 ms 348 KB Output is correct
18 Incorrect 2 ms 348 KB 22nd lines differ - on the 1st token, expected: '29', found: '28'
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 1 ms 344 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 1 ms 348 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 1 ms 344 KB Output is correct
24 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 7 ms 348 KB Output is correct
16 Correct 0 ms 432 KB Output is correct
17 Correct 4 ms 344 KB Output is correct
18 Correct 5 ms 348 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 0 ms 344 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 0 ms 348 KB Output is correct
24 Correct 1 ms 344 KB Output is correct
25 Correct 0 ms 348 KB Output is correct
26 Correct 0 ms 348 KB Output is correct
27 Correct 1 ms 348 KB Output is correct
28 Correct 0 ms 348 KB Output is correct
29 Correct 0 ms 348 KB Output is correct
30 Correct 0 ms 348 KB Output is correct
31 Correct 0 ms 348 KB Output is correct
32 Correct 1 ms 348 KB Output is correct
33 Correct 1 ms 348 KB Output is correct
34 Correct 0 ms 348 KB Output is correct
35 Correct 1 ms 344 KB Output is correct
36 Correct 0 ms 348 KB Output is correct
37 Correct 1 ms 348 KB Output is correct
38 Correct 1 ms 348 KB Output is correct
39 Correct 1 ms 348 KB Output is correct
40 Correct 2 ms 348 KB Output is correct
41 Correct 0 ms 436 KB Output is correct
42 Correct 0 ms 348 KB Output is correct
43 Correct 5 ms 348 KB Output is correct
44 Correct 1 ms 344 KB Output is correct
45 Correct 1 ms 348 KB Output is correct
46 Correct 1 ms 348 KB Output is correct
47 Correct 1 ms 348 KB Output is correct
48 Correct 1 ms 348 KB Output is correct
49 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '51', found: '50'
50 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 7 ms 348 KB Output is correct
16 Correct 0 ms 432 KB Output is correct
17 Correct 4 ms 344 KB Output is correct
18 Correct 5 ms 348 KB Output is correct
19 Incorrect 2 ms 348 KB 22nd lines differ - on the 1st token, expected: '29', found: '28'
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 7 ms 348 KB Output is correct
16 Correct 0 ms 432 KB Output is correct
17 Correct 4 ms 344 KB Output is correct
18 Correct 5 ms 348 KB Output is correct
19 Incorrect 2 ms 348 KB 22nd lines differ - on the 1st token, expected: '29', found: '28'
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 7 ms 348 KB Output is correct
16 Correct 0 ms 432 KB Output is correct
17 Correct 4 ms 344 KB Output is correct
18 Correct 5 ms 348 KB Output is correct
19 Incorrect 2 ms 348 KB 22nd lines differ - on the 1st token, expected: '29', found: '28'
20 Halted 0 ms 0 KB -