| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 842313 | flashmt | Closing Time (IOI23_closing) | C++17 | 106 ms | 23528 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 "closing.h"
#ifdef LOCAL
#include "Debug.h"
#else
#define debug(...) 42
#endif
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n;
vector<pair<int, int>> a[N];
vector<long long> bfs(int s)
{
vector<long long> dist(n, -1);
queue<int> q;
dist[s] = 0;
q.push(s);
while (!empty(q))
{
int x = q.front();
q.pop();
for (auto [y, w] : a[x])
if (dist[y] < 0)
{
dist[y] = dist[x] + w;
q.push(y);
}
}
return dist;
}
int max_score(int N, int A, int B, long long budget, vector<int> U, vector<int> V, vector<int> W)
{
n = N;
for (int i = 0; i < n; i++)
a[i].clear();
for (int i = 0; i < size(U); i++)
{
a[U[i]].push_back({V[i], W[i]});
a[V[i]].push_back({U[i], W[i]});
}
auto distA = bfs(A);
auto distB = bfs(B);
auto distAB = distA[B];
if (distAB > budget * 2)
{
vector<long long> allDists = distA;
for (auto d : distB)
allDists.push_back(d);
sort(begin(allDists), end(allDists));
int ans = 0;
for (auto d : allDists)
if (d <= budget)
{
ans++;
budget -= d;
}
return ans;
}
vector<long long> intCosts, extCosts;
for (int i = 0; i < n; i++)
{
auto cost = min(distA[i], distB[i]);
if (distA[i] + distB[i] == distAB) intCosts.push_back(cost);
else extCosts.push_back(cost);
}
int szInt = size(intCosts);
sort(begin(intCosts), end(intCosts));
vector<long long> sumIntSmall(szInt + 1);
vector<long long> sumIntBoth(szInt + 1);
for (int i = 0; i < szInt; i++)
{
sumIntSmall[i + 1] = sumIntSmall[i] + intCosts[i];
sumIntBoth[i + 1] = sumIntBoth[i] + distAB - intCosts[i];
}
int szExt = size(extCosts);
sort(begin(extCosts), end(extCosts));
vector<long long> sumExt(szExt + 1);
for (int i = 0; i < szExt; i++)
sumExt[i + 1] = sumExt[i] + extCosts[i];
debug(intCosts);
debug(extCosts);
int ans = 0;
for (int i = 0; i <= szInt; i++)
{
long long curCost = sumIntBoth[i];
if (curCost > budget)
continue;
int curAns = i * 2;
priority_queue<pair<long long, int>> q;
for (int j = i; j < szInt; j++)
q.push({-intCosts[j], 1});
for (int j = 0; j < szExt; j++)
q.push({-extCosts[j], 0});
while (!empty(q))
{
auto [cost, isInt] = q.top();
q.pop();
cost *= -1;
curCost += cost;
if (curCost > budget)
break;
curAns++;
if (!isInt)
q.push({-distAB, 1});
}
ans = max(ans, curAns);
}
return ans;
}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... | ||||
