QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#725580 | #5418. Color the Tree | Repeater | WA | 58ms | 3716kb | C++20 | 3.5kb | 2024-11-08 18:51:53 | 2024-11-08 18:51:53 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
constexpr i64 INF = 1e10;
struct HLD
{
int n;
std::vector<int> siz, top, dep, fa, L, R, id;
std::vector<std::vector<int>> adj;
int cur;
HLD() {}
HLD(int n)
{
init(n);
}
void init(int n)
{
this->n = n;
siz.resize(n);
top.resize(n);
dep.resize(n);
fa.resize(n);
L.resize(n);
R.resize(n);
id.resize(n);
cur = 0;
adj.assign(n, {});
}
void add(int u, int v)
{
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
void work(int root = 0)
{
top[root] = root;
dep[root] = 0;
fa[root] = -1;
dfs1(root);
dfs2(root);
}
void dfs1(int x)
{
if(fa[x] != -1)
adj[x].erase(std::find(adj[x].begin(), adj[x].end(), fa[x]));
siz[x] = 1;
for(auto &y : adj[x])
{
fa[y] = x;
dep[y] = dep[x] + 1;
dfs1(y);
siz[x] += siz[y];
if(siz[y] > siz[adj[x][0]]) std::swap(y, adj[x][0]);
}
}
void dfs2(int x)
{
L[x] = cur++;
id[L[x]] = x;
for(auto y : adj[x])
{
top[y] = (y == adj[x][0] ? top[x] : y);
dfs2(y);
}
R[x] = cur;
}
int lca(int x, int y)
{
while(top[x] != top[y])
{
if(dep[top[x]] > dep[top[y]]) x = fa[top[x]];
else y = fa[top[y]];
}
return dep[x] < dep[y] ? x : y;
}
};
struct ST
{
std::vector<std::vector<int>> f;
ST(std::vector<int> &a)
{
int n = a.size(), logn = std::__lg(n);
f.assign(n, std::vector<int>(logn + 1));
for(int i = 0; i < n; i++) f[i][0] = a[i];
for(int j = 0; j < logn; j++)
for(int i = 0; i + (1 << (j + 1)) - 1 < n; i++)
f[i][j + 1] = std::min(f[i][j], f[i + (1 << j)][j]);
}
int operator()(int l, int r)
{
if(l == r) return 0;
int log = std::__lg(r - l);
return std::min(f[l][log], f[r - (1 << log)][log]);
}
};
void solve()
{
int n; std::cin >> n;
std::vector<int> a(n);
for(int i = 0; i < n; i++) std::cin >> a[i];
ST st(a);
HLD tr(n);
for(int i = 1; i < n; i++)
{
int u, v; std::cin >> u >> v;
u--, v--;
tr.add(u, v);
}
tr.work();
std::vector<std::vector<int>> vec(n);
for(int i = 0; i < n; i++)
vec[tr.dep[i]].emplace_back(i);
// std::vector<std::vector<int>> adj(n);
auto cacl = [&](int D) -> i64
{
std::vector<std::vector<int>> adj(n);
if(D) vec[D].emplace_back(0);
std::sort(vec[D].begin(), vec[D].end(), [&](int x, int y)
{
return tr.L[x] < tr.L[y];
});
std::vector<int> tmp;
for(int i = 0; i + 1 < (int)vec[D].size(); i++)
{
tmp.emplace_back(vec[D][i]);
tmp.emplace_back(tr.lca(vec[D][i], vec[D][i + 1]));
}
tmp.emplace_back(vec[D].back());
std::sort(tmp.begin(), tmp.end(), [&](int x, int y)
{
return tr.L[x] < tr.L[y];
});
tmp.erase(std::unique(tmp.begin(), tmp.end()), tmp.end());
for(int i = 1; i < (int)tmp.size(); i++)
{
int lca = tr.lca(tmp[i], tmp[i - 1]);
adj[lca].emplace_back(tmp[i]);
}
auto dfs = [&](auto dfs, int x, int fa) -> i64
{
i64 res = 0;
if(adj[x].empty()) res = INF;
else for(auto y : adj[x])
res += dfs(dfs, y, x);
if(fa != -1) res = std::min<i64>(res, st(D - tr.dep[x], D - tr.dep[fa] + 1));
return res;
};
return dfs(dfs, 0, -1);
};
i64 ans = a[0];
for(int i = 1; i < n; i++) if(vec[i].size())
ans += cacl(i);
std::cout << ans << "\n";
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t; std::cin >> t;
while(t--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3572kb
input:
3 4 10 15 40 1 1 2 2 3 2 4 5 10 5 1 100 1000 1 2 2 3 2 4 4 5 4 1000 200 10 8 1 2 2 3 3 4
output:
35 17 1218
result:
ok 3 number(s): "35 17 1218"
Test #2:
score: -100
Wrong Answer
time: 58ms
memory: 3716kb
input:
3000 54 43 44 11 49 17 14 7 30 35 12 34 14 15 8 29 47 30 31 39 17 26 23 26 45 34 50 49 13 35 18 29 15 13 44 47 5 22 20 19 46 30 22 26 13 47 46 43 27 48 48 13 14 30 44 1 2 1 3 2 4 3 5 4 6 2 7 4 8 1 9 3 10 1 11 8 12 2 13 9 14 1 15 1 16 15 17 15 18 7 19 1 20 19 21 13 22 10 23 17 24 9 25 9 26 24 27 8 28...
output:
520 309 569 461 229 494 619 180 118 185 155 120 359 227 404 276 264 528 280 275 168 264 94 538 405 401 392 496 125 345 467 473 163 346 363 529 474 197 307 309 135 169 739 341 611 475 536 127 320 59 56 67 240 307 462 206 167 537 60 426 357 194 321 200 825 124 265 532 138 825 301 161 188 303 537 666 1...
result:
wrong answer 1st numbers differ - expected: '180', found: '520'