QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#668621 | #5418. Color the Tree | afy | AC ✓ | 236ms | 42920kb | C++11 | 6.3kb | 2024-10-23 15:15:57 | 2024-10-23 15:15:58 |
Judging History
answer
#include <bits/stdc++.h>
#ifdef LOCAL
#include "debug.h"
#else
#define deb(...)
#endif
using namespace std;
#define ll long long
// #define int long long
#define ull unsigned long long
#define pii pair<int, int>
#define db double
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl "\n"
#define alls(x) (x).begin(), (x).end()
#define fs first
#define sec second
#define bug(x) (void)(cerr << "L" << __LINE__ << ": " << #x << " = " << (x) << endl)
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1.0);
struct edge {
int v, w;
};
struct HLD {
int n;
vector<int> siz, top, parent, l, r, hson, dep;
vector<vector<edge>> adj;
int idx;
vector<int> mn; // 1-u的最小边权
HLD() {}
HLD(int n) {
init(n);
}
void init(int n) {
this->n = n;
siz.resize(n + 1), hson.resize(n + 1), top.resize(n + 1);
parent.resize(n + 1);
l.resize(n + 1), r.resize(n + 1);
idx = 0;
adj.resize(n + 1), dep.resize(n + 1);
// 根据题目要求加数据结构
}
void addEdge(int u, int v, int w) {
adj[u].push_back({v, w});
}
void work(int root = 1) {
top[root] = root;
parent[root] = -1;
dep[root] = 1;
dfs1(root, -1);
dfs2(root, root);
}
void dfs1(int u, int f) { // 搞fa,dep,son
siz[u] = 1;
for (auto [v, w] : adj[u]) {
if (v == f)
continue;
parent[v] = u;
dep[v] = dep[u] + 1;
dfs1(v, u);
siz[u] += siz[v];
if (siz[hson[u]] < siz[v])
hson[u] = v;
}
}
void dfs2(int u, int t) { // 搞top
top[u] = t; // 记录链头
l[u] = ++idx;
if (!hson[u]) {
r[u] = idx;
return;
} // 无重儿子
dfs2(hson[u], t); // 搜重儿子
for (auto [v, w] : adj[u]) {
if (v == parent[u] || v == hson[u])
continue;
dfs2(v, v); // 搜轻儿子
}
r[u] = idx;
}
int lca(int u, int v) {
while (top[u] != top[v]) {
if (dep[top[u]] > dep[top[v]]) {
u = parent[top[u]];
} else {
v = parent[top[v]];
}
}
return dep[u] < dep[v] ? u : v;
}
bool isAncester(int u, int v) { // 判断u是不是v的祖先
return l[u] <= l[v] && r[v] <= r[u];
}
};
template <typename T, class F = function<T(const T&, const T&)>>
struct SparseTable {
int n;
vector<vector<T>> st;
F func;
SparseTable(const vector<T>& a, const F& f) : func(f) {
n = (int)a.size() - 1;
int max_log = __lg(n) + 1;
st.resize(max_log + 1);
st[0] = a;
for (int j = 1; j <= max_log; j++) {
st[j].resize(n + 1);
for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
st[j][i] = func(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);
}
}
}
T get(int l, int r) const {
int len = __lg(r - l + 1);
return func(st[len][l], st[len][r - (1 << len) + 1]);
}
};
void solve() {
int n;
cin >> n;
HLD hld(n);
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
SparseTable<int> qmn(a, [](int i, int j) {
return min(i, j);
});
for (int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
hld.addEdge(u, v, 1);
hld.addEdge(v, u, 1);
}
auto cmp = [&](int i, int j) {
return hld.l[i] < hld.l[j];
};
hld.work(1);
auto buildvt = [&](vector<int>& node, vector<vector<edge>>& e, int rt) {
node.push_back(rt); // 保证根节点在虚树中存在
sort(alls(node), cmp);
node.erase(unique(alls(node)), node.end());
set<int> tmp;
for (auto x : node) tmp.insert(x);
for (int i = 1; i < (int)node.size(); i++) tmp.insert(hld.lca(node[i - 1], node[i]));
node.clear();
for (auto x : tmp) node.push_back(x);
sort(alls(node), cmp);
vector<int> st; // 维护一个栈
for (auto v : node) {
while (!st.empty() && !hld.isAncester(st.back(), v))
st.pop_back();
if (!st.empty())
e[st.back()].push_back({v, hld.dep[v] - hld.dep[st.back()]});
st.push_back(v);
}
};
vector<vector<edge>> e(n + 1);
vector<vector<int>> q(n + 1);
int maxdep = 0;
for (int i = 1; i <= n; i++) q[hld.dep[i]].push_back(i), maxdep = max(maxdep, hld.dep[i]);
ll ans = 0;
vector<ll> dp(n + 1, 1e18);
int cur = 0;
function<void(int, int)> cal = [&](int u, int fa) {
ll tmp = 0;
if (e[u].size() == 0)
tmp = 1e18;
for (auto [v, w] : e[u]) {
if (v == fa)
continue;
deb(u, v);
cal(v, u);
int ql = cur - hld.dep[v];
int qr = cur - hld.dep[u] - 1;
assert(ql <= qr);
ql++;
qr++; // 深度偏移
tmp += min(dp[v], (ll)qmn.get(ql, qr));
}
dp[u] = min(tmp, (ll)a[cur - hld.dep[u] + 1]); // +1是深度偏移
};
auto clear = [&](vector<int>& node) {
for (auto x : node) {
e[x].clear();
dp[x] = 1e18;
}
};
for (int i = 1; i <= maxdep; i++) {
vector<int> node;
for (auto x : q[i]) node.push_back(x);
cur = i;
deb(i, node);
buildvt(node, e, 1);
cal(1, 1);
deb(dp[1]);
ans += dp[1];
clear(node);
deb("end");
}
cout << ans << endl;
}
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
#ifdef LOCAL
double starttime = clock();
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int t = 1;
cin >> t;
while (t--) solve();
#ifdef LOCAL
double endtime = clock();
cerr << "Time Used: " << (double)(endtime - starttime) / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#endif
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3592kb
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: 0
Accepted
time: 74ms
memory: 3748kb
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:
180 168 222 230 156 240 225 126 100 81 155 73 154 127 149 124 228 230 132 187 153 170 78 282 195 286 191 211 119 197 211 233 88 252 239 233 173 180 195 121 109 148 180 175 226 210 182 97 199 59 56 31 115 204 203 172 139 208 53 140 189 170 173 137 233 94 163 273 80 350 156 133 146 159 240 269 137 222...
result:
ok 3000 numbers
Test #3:
score: 0
Accepted
time: 77ms
memory: 3928kb
input:
300 474 5 24 21 41 15 23 43 48 32 19 27 40 10 49 40 6 18 41 43 31 45 18 35 36 12 10 23 45 28 23 14 43 37 45 12 16 20 17 49 13 22 8 30 19 27 40 22 14 30 47 16 39 25 48 21 26 50 8 14 26 9 30 41 15 44 24 16 46 50 39 25 47 24 45 21 18 26 21 5 39 15 10 47 48 11 44 44 33 23 14 35 39 35 30 38 9 13 15 39 5 ...
output:
329 183 264 219 323 220 348 342 410 395 80 201 299 144 207 408 360 215 283 104 320 394 277 210 273 285 242 253 265 379 360 322 202 351 195 196 266 270 171 342 239 283 286 300 331 317 345 268 173 296 275 224 480 330 264 162 199 378 254 214 231 293 229 259 241 268 380 419 233 185 364 341 328 237 320 3...
result:
ok 300 numbers
Test #4:
score: 0
Accepted
time: 91ms
memory: 5528kb
input:
30 4926 18 13 47 7 21 39 28 48 21 44 14 18 39 13 46 33 6 49 9 7 10 29 29 25 38 15 16 42 41 41 40 14 26 13 6 19 17 31 24 18 30 24 48 46 38 21 28 42 29 50 33 28 18 26 18 42 13 23 35 20 32 6 17 25 44 46 35 36 50 24 7 29 34 14 41 41 8 33 22 46 7 6 22 40 24 8 44 36 38 13 37 37 25 22 7 43 50 33 19 44 24 4...
output:
427 520 443 359 427 408 371 415 482 436 269 530 478 485 435 453 418 503 443 453 405 425 347 564 297 435 559 453 213 395
result:
ok 30 numbers
Test #5:
score: 0
Accepted
time: 74ms
memory: 3740kb
input:
3000 74 555233197 518812085 998593787 821753058 967306600 663279435 696954042 885219300 489323226 146136486 447383587 785317885 838306349 708275482 715157265 298848995 400280904 374077023 673881523 207667786 885945020 459791675 992519779 327830583 821713695 253985403 926395863 419409783 138881726 80...
output:
6742611216 5794349776 3087356867 4707144715 2761702533 3246645261 4802134565 2999820393 4887036613 2784978973 3593730307 4783057633 4621084176 4331196830 4242984461 2287799528 3027767371 3699192818 3888960419 6398323452 2766114996 1734720583 6543430036 1955540148 5464479116 3177069662 5145942113 302...
result:
ok 3000 numbers
Test #6:
score: 0
Accepted
time: 83ms
memory: 3920kb
input:
300 621 259262308 372414267 976777900 567821544 262206094 972740633 932600104 702535786 494092920 919901107 797100568 708295156 632473907 101958470 952065075 970482879 183543308 323078517 719011818 352232578 159576652 124505381 125133768 492132730 331846050 577415810 369370004 871034176 529186574 44...
output:
8143086197 8197999468 5370721620 5343127707 5868323006 7992625789 5749423188 5019336842 5319894438 5228239187 5391752908 6084605805 6792215852 6057910407 8471127525 2719747215 6909535671 5100581420 5878004843 5586237425 6343902433 9390109727 5651124389 5472179570 7945151774 5064107530 4433748186 571...
result:
ok 300 numbers
Test #7:
score: 0
Accepted
time: 84ms
memory: 5340kb
input:
30 5308 560111855 290003681 946208440 140658046 860834453 480249720 506770353 922783074 600720525 693059141 436061359 545671168 528534807 339705109 831632761 570564203 113225613 578123930 293066534 269996029 765346927 443717770 933144287 856263710 475170893 174188152 464281143 864607591 443380284 12...
output:
8829755982 7996435040 9259425768 7684533044 9842457103 3917213508 5939555066 8695995697 9431906955 7466353560 8322921019 8970732656 8099619221 9390765699 6773331885 8521621715 9998520099 7876760589 6482847050 10167157889 8563826262 5569616375 7783052317 7313404561 7224267995 8986870714 9082031438 99...
result:
ok 30 numbers
Test #8:
score: 0
Accepted
time: 66ms
memory: 7064kb
input:
30 235 99 26 36 76 38 12 81 57 32 53 24 100 83 36 73 40 99 67 25 59 13 53 26 96 88 91 70 75 50 28 43 91 28 80 21 10 28 96 81 46 93 48 47 65 16 51 39 13 17 68 87 47 11 53 35 59 95 17 12 28 42 72 69 93 10 99 55 36 17 10 17 82 46 47 30 13 33 46 47 82 26 70 89 11 84 15 75 82 23 15 26 21 33 100 80 68 59 ...
output:
1853 53585 70793 41175 65095 19429 62735 44418 35618 52989 22194 74287 66783 60324 23354 10188 45849 43317 47709 44425 17639 2392 67454 75522 52049 63546 17778 37186 1857 31275
result:
ok 30 numbers
Test #9:
score: 0
Accepted
time: 134ms
memory: 42920kb
input:
3 99260 99 92 50 79 91 45 21 68 66 95 60 65 65 45 85 36 33 49 93 97 17 80 84 82 53 62 68 77 54 84 19 75 37 54 64 80 88 60 26 31 73 14 50 19 31 91 28 49 49 92 98 41 30 21 42 83 51 79 48 51 41 10 73 83 61 43 51 95 80 19 46 45 43 62 86 52 62 100 22 98 25 67 76 59 55 42 76 18 17 63 38 92 73 22 58 93 65 ...
output:
745947 689647 711794
result:
ok 3 number(s): "745947 689647 711794"
Test #10:
score: 0
Accepted
time: 125ms
memory: 36068kb
input:
3 100000 736164847 712451679 953221063 129734069 649878938 636159027 756625444 636178736 261073374 499660659 102302453 703591271 759851774 246224168 542866587 140617030 541228236 263272492 844843580 256780933 617601578 765332709 439622302 345560268 242255574 736020813 919249591 429525347 775345503 8...
output:
8765474998668 8767125090439 8759555000012
result:
ok 3 number(s): "8765474998668 8767125090439 8759555000012"
Test #11:
score: 0
Accepted
time: 116ms
memory: 6916kb
input:
30 10000 820875351 110118090 318290090 291550265 156728512 898695407 702936634 537529650 492026966 990954215 887311683 471855239 487268950 596796482 921910579 683211841 356504873 821436540 819581602 702676749 720024595 328497612 866905494 831557624 659171036 168505311 122782601 291094304 671588990 9...
output:
883467120694 893610662749 883906059936 882107337810 879231409121 884351970198 892461121041 888728631421 876218733693 882844635398 886784539966 883172718934 884651829402 884399545744 890807049327 887954375238 883852918523 888403782419 887498755532 880151218208 892907290650 882172390896 881732561237 8...
result:
ok 30 numbers
Test #12:
score: 0
Accepted
time: 236ms
memory: 25832kb
input:
3 100000 909474963 414166441 677161271 688542123 650201469 390309276 856663547 621207079 459811934 582838909 425785542 857661802 918712852 367645535 521783456 937759651 260632908 430905661 671167895 796755368 996221059 593819531 523770923 894242006 779434511 193459764 316358533 460721669 825011706 3...
output:
57147733548 44853213726 44403945508
result:
ok 3 number(s): "57147733548 44853213726 44403945508"
Test #13:
score: 0
Accepted
time: 195ms
memory: 25624kb
input:
3 100000 784731820 441612049 231013785 411550408 129294588 649753537 481462845 676592818 778982959 179403366 119330183 246561078 480033332 904236648 531363073 453276112 858901112 261361645 385753122 773663421 838636681 867032978 217985662 757527556 801360921 400949426 431795344 842282949 460946349 5...
output:
164667798192 128371764672 111980717406
result:
ok 3 number(s): "164667798192 128371764672 111980717406"
Test #14:
score: 0
Accepted
time: 114ms
memory: 27256kb
input:
3 100000 596147745 223984585 321060496 836040854 531932227 164460971 662224682 418129867 444375231 885587796 208707375 692215658 908699579 849426347 686769155 299416570 320642243 432987479 452056946 250651084 751940769 780605821 386414554 290323159 222811216 656912068 831464659 621638040 952600162 9...
output:
435962040433 558704468744 578552805560
result:
ok 3 number(s): "435962040433 558704468744 578552805560"
Test #15:
score: 0
Accepted
time: 156ms
memory: 3772kb
input:
300 1000 306155973 502827111 154815976 498580847 143323927 427577658 729017009 385469320 282879354 730478149 292829273 716249730 785070076 560330250 598364372 939399616 585039212 850280897 722508936 220628755 135815134 579721227 353260095 293228175 586309693 503298178 847459502 536849421 625285745 6...
output:
10262465475 19119326129 12062920235 12137743449 13594380675 17341639220 10991714214 18829859456 17577744690 14603342312 17177860522 19397559314 22251073639 13630162409 15953666923 23921433778 23214301266 24629614692 13126058238 26897894988 10714431253 15557242432 18578687240 13481669075 18359475028 ...
result:
ok 300 numbers
Test #16:
score: 0
Accepted
time: 138ms
memory: 33160kb
input:
3 100000 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 114514 1145...
output:
229028 229028 229028
result:
ok 3 number(s): "229028 229028 229028"