# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
49439 |
2018-05-29T00:47:02 Z |
ho94949 |
Race (IOI11_race) |
C++17 |
|
49 ms |
52884 KB |
#include "race.h"
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int MAXN = 202020;
const int MAXK = 1010101;
int N, K;
vector<pair<int, int> > conn[MAXN];
bool visit_centroid[MAXN];
//solve for one vertex
namespace solver
{
set<int> used;
map<int, int> V[MAXK];
//added color & weight
void dfs(int a, int pa, int c, int len, int depth)
{
if(len>K) return;
used.insert(len);
V[len][c] = depth;
for(auto tmp: conn[a])
{
int x, w; tie(x, w) = tmp;
if(visit_centroid[x] || x == pa) continue;
dfs(x, a, c, len + w, depth+1);
}
}
int solve(int a)
{
int tp = 0;
for(auto tmp: conn[a])
{
int x, w; tie(x, w) = tmp;
if(visit_centroid[x]) continue;
dfs(x, a, ++tp, w, 1);
}
used.insert(0);
V[0][-1] = 0;
int ans = N;
for(int x: used)
{
pair<int, int> min1(N, 0), min2(N, 0);
for(auto y: V[x])
{
auto yrev = make_pair(y.second, y.first);
if(min1 > yrev)
{
min2 = min1;
min1 = yrev;
}
else if(min2 > yrev) min2 = yrev;
}
for(auto y: V[K-x])
{
if(y.first != min1.second)
ans = min(ans, y.second+min1.first);
if(y.first != min2.second)
ans = min(ans, y.second+min2.first);
}
}
//cleanup
for(int x: used) V[x].clear();
used.clear();
return ans;
}
}
//context getting centroid
namespace centroid
{
int size[MAXN];
int max_subsize[MAXN];
vector<int> subtree;
void dfs(int a, int pa)
{
subtree.push_back(a);
size[a] = 1; max_subsize[a] = 0;
for(auto tmp: conn[a])
{
int x, _; tie(x, _) = tmp;
if(visit_centroid[x] || x == pa) continue;
dfs(x, a);
size[a] += size[x];
max_subsize[a] = max(max_subsize[a], size[x]);
}
}
int get_centroid(int x)
{
subtree.clear();
dfs(x, -1);
int minv = subtree.size();
int mini = -1;
for(auto y: subtree)
{
int v = max((int)subtree.size()-size[y], max_subsize[y]);
if(minv > v)
{
minv = v;
mini = y;
}
}
return mini;
}
}
int best_path(int _N, int _K, int H[][2], int L[])
{
N = _N; K = _K;
for(int i=0; i<N-1; ++i)
{
int s = H[i][0], e = H[i][1], x = L[i];
conn[s].emplace_back(e, x);
conn[e].emplace_back(s, x);
}
int ans = N;
queue<int> Q;
Q.push(0);
while(!Q.empty())
{
int v = centroid::get_centroid(Q.front()); Q.pop();
ans = min(ans, solver::solve(v));
visit_centroid[v] = true;
for(auto x: conn[v])
if(!visit_centroid[x.first])
Q.push(x.first);
}
if(ans == N) ans = -1;
return ans;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
52472 KB |
Output is correct |
2 |
Correct |
49 ms |
52584 KB |
Output is correct |
3 |
Correct |
43 ms |
52688 KB |
Output is correct |
4 |
Correct |
46 ms |
52780 KB |
Output is correct |
5 |
Correct |
46 ms |
52780 KB |
Output is correct |
6 |
Correct |
44 ms |
52832 KB |
Output is correct |
7 |
Correct |
42 ms |
52844 KB |
Output is correct |
8 |
Correct |
44 ms |
52844 KB |
Output is correct |
9 |
Correct |
45 ms |
52844 KB |
Output is correct |
10 |
Correct |
44 ms |
52884 KB |
Output is correct |
11 |
Correct |
45 ms |
52884 KB |
Output is correct |
12 |
Correct |
44 ms |
52884 KB |
Output is correct |
13 |
Correct |
42 ms |
52884 KB |
Output is correct |
14 |
Incorrect |
44 ms |
52884 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
52472 KB |
Output is correct |
2 |
Correct |
49 ms |
52584 KB |
Output is correct |
3 |
Correct |
43 ms |
52688 KB |
Output is correct |
4 |
Correct |
46 ms |
52780 KB |
Output is correct |
5 |
Correct |
46 ms |
52780 KB |
Output is correct |
6 |
Correct |
44 ms |
52832 KB |
Output is correct |
7 |
Correct |
42 ms |
52844 KB |
Output is correct |
8 |
Correct |
44 ms |
52844 KB |
Output is correct |
9 |
Correct |
45 ms |
52844 KB |
Output is correct |
10 |
Correct |
44 ms |
52884 KB |
Output is correct |
11 |
Correct |
45 ms |
52884 KB |
Output is correct |
12 |
Correct |
44 ms |
52884 KB |
Output is correct |
13 |
Correct |
42 ms |
52884 KB |
Output is correct |
14 |
Incorrect |
44 ms |
52884 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
52472 KB |
Output is correct |
2 |
Correct |
49 ms |
52584 KB |
Output is correct |
3 |
Correct |
43 ms |
52688 KB |
Output is correct |
4 |
Correct |
46 ms |
52780 KB |
Output is correct |
5 |
Correct |
46 ms |
52780 KB |
Output is correct |
6 |
Correct |
44 ms |
52832 KB |
Output is correct |
7 |
Correct |
42 ms |
52844 KB |
Output is correct |
8 |
Correct |
44 ms |
52844 KB |
Output is correct |
9 |
Correct |
45 ms |
52844 KB |
Output is correct |
10 |
Correct |
44 ms |
52884 KB |
Output is correct |
11 |
Correct |
45 ms |
52884 KB |
Output is correct |
12 |
Correct |
44 ms |
52884 KB |
Output is correct |
13 |
Correct |
42 ms |
52884 KB |
Output is correct |
14 |
Incorrect |
44 ms |
52884 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
52472 KB |
Output is correct |
2 |
Correct |
49 ms |
52584 KB |
Output is correct |
3 |
Correct |
43 ms |
52688 KB |
Output is correct |
4 |
Correct |
46 ms |
52780 KB |
Output is correct |
5 |
Correct |
46 ms |
52780 KB |
Output is correct |
6 |
Correct |
44 ms |
52832 KB |
Output is correct |
7 |
Correct |
42 ms |
52844 KB |
Output is correct |
8 |
Correct |
44 ms |
52844 KB |
Output is correct |
9 |
Correct |
45 ms |
52844 KB |
Output is correct |
10 |
Correct |
44 ms |
52884 KB |
Output is correct |
11 |
Correct |
45 ms |
52884 KB |
Output is correct |
12 |
Correct |
44 ms |
52884 KB |
Output is correct |
13 |
Correct |
42 ms |
52884 KB |
Output is correct |
14 |
Incorrect |
44 ms |
52884 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |