# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
897669 | ErJ | Closing Time (IOI23_closing) | C++17 | 1121 ms | 2097152 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector<ll>
#define vvi vector<vector<ll>>
#define vs vector<string>
#define vc vector<char>
#define vb vector<bool>
#define vp vector<pair<ll, ll>>
#define pp pair<ll, ll>
#define qi queue<ll>
#define qp queue<pp>
#define pqi priority_queue<ll>
#define pqp priority_queue<pp>
#define mi map<ll, ll>
#define mpi map<pp, ll>
#define mip map<ll, pp>
#define mpp map<pp, pp>
#define mb map<ll, bool>
#define si set<ll>
#define sp set<pp>
#define mod 1000000007
#define rep(a, b) for(int a = 0; a < (b); a++)
#define rep2(a, b) for(int a = 1; a < (b); a++)
#define inf 1000000000000000000
int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) {
vector<ll> distX(N);
vector<ll> distY(N);
vector<ll> distXY(N);
vector<ll> distXY2(N), distXY3(N);
distX[X] = 0;
distX[Y] = 0;
vector<vp> edges(N);
rep(i, U.size()) {
edges[U[i]].push_back({ V[i], W[i] });
edges[V[i]].push_back({ U[i], W[i] });
}
queue<int> q;
vb was(N);
rep(i, N) was[i] = false;
q.push(X);
vector<int> from(N);
from[X] = -1;
while (!q.empty()) {
ll u = q.front();
was[u] = true;
q.pop();
for (int i = 0; i < edges[u].size(); i++) {
ll v = edges[u][i].first;
ll dw = edges[u][i].second;
if (!was[v]) {
q.push(v);
from[v] = u;
distX[v] = distX[u] + dw;
}
}
}
rep(i, N) was[i] = false;
queue<int> q2;
q2.push(Y);
while (!q2.empty()) {
ll u = q2.front();
was[u] = true;
q2.pop();
for (int i = 0; i < edges[u].size(); i++) {
ll v = edges[u][i].first;
ll dw = edges[u][i].second;
if (!was[v]) {
q2.push(v);
distY[v] = distY[u] + dw;
}
}
}
vector<bool> mainLine(N);
rep(i, N) mainLine[i] = false;
int akt = Y;
while (akt != -1) {
mainLine[akt] = true;
akt = from[akt];
}
for (int i = 0; i < N; i++) {
distXY[i] = max(distX[i], distY[i]);
distXY2[i] = min(distX[i], distY[i]);
distXY3[i] = distXY2[i];
}
sort(distXY3.begin(), distXY3.end());
ll anslvl1 = 0;
ll sum = 0;
rep(i, distXY3.size()) {
sum += distXY3[i];
if (sum <= K) {
anslvl1++;
}
}
vvi dp(N + 1);
dp[0].resize(2*N + 1);
for (int i = 0; i < 2 * N + 1; i++) {
dp[0][i] = inf;
}
dp[0][0] = 0;
for (int i = 1; i < dp.size(); i++) {
dp[i].resize(2 * N + 1);
if (!mainLine[i-1]) {
for (int j = 0; j < 2 * N + 1; j++) {
dp[i][j] = dp[i - 1][j];
}
}
else {
for (int j = 0; j < 2 * N + 1; j++) {
dp[i][j] = inf;
}
}
for (int j = 0; j < 2 * N + 1; j++) {
if (dp[i - 1][j] != inf) {
dp[i][j + 1] = min(dp[i][j + 1], dp[i - 1][j] + distXY2[i - 1]);
dp[i][j + 2] = min(dp[i][j + 2], dp[i - 1][j] + distXY[i - 1]);
}
}
}
ll ans = 0;
for (int i = 2 * N; i >= 0; i--) {
if (dp[N][i] <= K) {
ans = i;
break;
}
}
return max(ans, anslvl1);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |