Submission #1047027

#TimeUsernameProblemLanguageResultExecution timeMemory
1047027pavementClosing Time (IOI23_closing)C++17
9 / 100
1037 ms24656 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ii = pair<int, int>;

#define pb push_back
#define eb emplace_back

ll distX[200005], distY[200005];
vector<ii> adj[200005];

void get_dist(int u, ll dist[], int e = -1) {
	for (auto [v, w] : adj[u]) if (v != e) {
		dist[v] = dist[u] + w;
		get_dist(v, dist, u);
	}
}

int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) {
	for (int i = 0; i < N - 1; i++) {
		adj[U[i]].eb(V[i], W[i]);
		adj[V[i]].eb(U[i], W[i]);
	}
	get_dist(X, distX);
	get_dist(Y, distY);
	int ret = 0;
	for (int i = X; i >= 0; i--) {
		for (int j = X; j < N; j++) {
			for (int k = Y; k >= 0; k--) {
				for (int l = Y; l < N; l++) {
					ll cur = 0;
					for (int a = 0; a < N; a++) {
						bool cov1 = (i <= a && a <= j);
						bool cov2 = (k <= a && a <= l);
						if (cov1 && cov2) {
							cur += max(distX[a], distY[a]);
						} else if (cov1) {
							cur += distX[a];
						} else if (cov2) {
							cur += distY[a];
						}
					}
					if (cur <= K) {
						ret = max(ret, j - i + 1 + l - k + 1);
					}
				}
			}
		}
	}
	for (int i = 0; i < N; i++) {
		adj[i].clear();
		distX[i] = distY[i] = 0;
	}
	return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...