QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#444322 | #8647. JOI Tour | arbuzick# | 0 | 101ms | 28884kb | C++20 | 6.0kb | 2024-06-15 18:18:18 | 2024-06-15 18:18:20 |
Judging History
answer
#include "joitour.h"
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int R = 1 << 18;
struct Node {
array<int, 3> cnt;
array<long long, 3> sum_cnt;
array<long long, 3> sum_heavy;
Node() {
cnt.fill(0);
sum_cnt.fill(0);
sum_heavy.fill(0);
}
Node operator+(Node b) {
Node ans;
for (int i = 0; i < 3; ++i) {
ans.cnt[i] = cnt[i] + b.cnt[i];
ans.sum_cnt[i] = sum_cnt[i] + b.sum_cnt[i];
ans.sum_heavy[i] = sum_heavy[i] + b.sum_heavy[i];
// if (cnt[1]) {
// ans.sum_cnt[i] += sum_cnt[i];
// ans.sum_heavy[i] += sum_heavy[i];
// }
// if (b.cnt[1]) {
// ans.sum_cnt[i] += b.sum_cnt[i];
// ans.sum_heavy[i] += b.sum_heavy[i];
// }
}
return ans;
}
// void add(Node b) {
// for (int i = 0; i < 3; ++i) {
// cnt[i] += b.cnt[i];
// sum_cnt[i] += b.sum_cnt[i];
// sum_heavy[i] += b.sum_heavy[i];
// }
// }
};
constexpr int maxn = 2e5 + 5;
vector<int> g[maxn];
int pr[maxn], sz[maxn];
void dfs(int v) {
sz[v] = 1;
for (auto u : g[v]) {
if (u != pr[v]) {
pr[u] = v;
dfs(u);
sz[v] += sz[u];
}
}
for (int i = 0; i < (int)g[v].size(); ++i) {
if (g[v][i] == pr[v]) {
swap(g[v][i], g[v].back());
}
}
if (v != 0) {
g[v].pop_back();
}
for (int i = 0; i < (int)g[v].size(); ++i) {
if (sz[g[v][i]] > sz[g[v][0]]) {
swap(g[v][i], g[v][0]);
}
}
}
int tp[maxn];
int cnt_all[3];
int cnt[maxn][3], cnt_heavy[maxn][3];
int t = 0;
int tin[maxn], tout[maxn];
int ord[maxn];
void dfs2(int v) {
tin[v] = t++;
ord[tin[v]] = v;
for (auto u : g[v]) {
dfs2(u);
}
tout[v] = t;
}
long long sum[maxn];
long long cnt_sum[3];
long long ans = 0;
Node vals[maxn];
void add_to_root(int v, int vl, int tp) {
vals[v].cnt[vl] += tp;
vals[v].sum_cnt[vl] += tp;
vals[v].sum_heavy[vl] += tp;
int prv = v, nw = pr[v];
while (prv != 0) {
vals[nw].sum_cnt[vl] += tp;
if (prv == g[nw][0]) {
vals[nw].sum_heavy[vl] += tp;
} else {
if (vl != 1) {
sum[nw] += tp * vals[prv].cnt[vl ^ 2];
}
}
prv = nw;
nw = pr[nw];
}
}
pair<Node, long long> get_to_root(int v) {
int prv = v, nw = pr[v];
Node ans;
long long ret = 0;
while (prv != 0) {
if (tp[nw] == 1) {
ans = ans + vals[nw];
ret += vals[prv].sum_cnt[tp[v] ^ 2];
}
prv = nw;
nw = pr[nw];
}
return make_pair(ans, ret);
}
Node get_segm(int l, int r) {
Node ans;
for (int i = l; i < r; ++i) {
if (tp[ord[i]] == 1) {
ans = ans + vals[ord[i]];
}
}
return ans;
}
void change(int32_t x, int32_t y) {
if (tp[x] == y) {
return;
}
ans -= cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
cnt_all[tp[x]]--;
ans += cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
// cout << "? " << ans << endl;
if (tp[x] == 0 || tp[x] == 2) {
auto [node, ret] = get_to_root(x);
ans += ret;
auto node2 = get_segm(tin[0], tout[0]);
ans += (node2.cnt[1] - node.cnt[1]) * 1LL * cnt_all[tp[x] ^ 2] - (node2.sum_cnt[tp[x] ^ 2] - node.sum_cnt[tp[x] ^ 2]);
} else {
// cout << "!!!" << sum[x] << ' ' << vals[x].sum_heavy[0] << ' ' << vals[x].sum_heavy[2] << endl;
ans += sum[x];
ans += vals[x].sum_heavy[0] * 1LL * vals[x].sum_heavy[2];
ans += (cnt_all[0] - vals[x].sum_cnt[0]) * 1LL * (cnt_all[2] - vals[x].sum_cnt[2]);
}
add_to_root(x, tp[x], -1);
// cout << "!!!" << ans << endl;
tp[x] = y;
ans -= cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
cnt_all[tp[x]]++;
ans += cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
if (tp[x] == 0 || tp[x] == 2) {
auto [node, ret] = get_to_root(x);
ans -= ret;
auto node2 = get_segm(tin[0], tout[0]);
ans -= (node2.cnt[1] - node.cnt[1]) * 1LL * cnt_all[tp[x] ^ 2] - (node2.sum_cnt[tp[x] ^ 2] - node.sum_cnt[tp[x] ^ 2]);
} else {
ans -= sum[x];
ans -= vals[x].sum_heavy[0] * 1LL * vals[x].sum_heavy[2];
ans -= (cnt_all[0] - vals[x].sum_cnt[0]) * 1LL * (cnt_all[2] - vals[x].sum_cnt[2]);
}
add_to_root(x, tp[x], 1);
}
void init(int32_t n, vector<int32_t> f, vector<int32_t> u, vector<int32_t> v, int32_t q) {
for (int i = 0; i < n; ++i) {
tp[i] = -1;
}
for (int i = 0; i < n - 1; ++i) {
g[u[i]].push_back(v[i]);
g[v[i]].push_back(u[i]);
}
dfs(0);
dfs2(0);
ans = cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
for (int x = 0; x < n; ++x) {
tp[x] = f[x];
ans -= cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
cnt_all[tp[x]]++;
ans += cnt_all[0] * 1LL * cnt_all[1] * 1LL * cnt_all[2];
if (tp[x] == 0 || tp[x] == 2) {
auto [node, ret] = get_to_root(x);
ans -= ret;
auto node2 = get_segm(tin[0], tout[0]);
ans -= (node2.cnt[1] - node.cnt[1]) * 1LL * cnt_all[tp[x] ^ 2] - (node2.sum_cnt[tp[x] ^ 2] - node.sum_cnt[tp[x] ^ 2]);
// if (x == 4) {
// cout << "!!!" << ret << endl;
// }
} else {
ans -= sum[x];
ans -= vals[x].sum_heavy[0] * 1LL * vals[x].sum_heavy[2];
ans -= (cnt_all[0] - vals[x].sum_cnt[0]) * 1LL * (cnt_all[2] - vals[x].sum_cnt[2]);
}
add_to_root(x, tp[x], 1);
}
}
long long num_tours() {
// cout << "!" << ans << endl;
return ans;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 25008kb
input:
400 1 1 0 2 2 0 2 1 1 1 1 0 1 2 2 2 2 0 0 2 0 2 0 2 1 1 2 2 1 2 1 0 1 2 2 2 0 0 0 2 1 2 2 0 0 0 1 2 1 1 0 1 1 2 1 2 2 2 1 1 0 1 1 1 2 2 1 1 0 0 1 1 0 0 1 1 1 2 2 2 1 1 2 1 1 1 0 2 0 2 1 0 1 1 2 0 0 2 1 0 2 2 1 0 0 0 0 1 1 1 0 1 2 1 1 1 2 0 2 2 0 2 0 1 0 1 1 1 1 0 1 1 0 0 0 2 2 0 2 2 2 1 1 0 1 2 0 1 ...
output:
599422 605983 605766 602018 599558 595979 595201 587602 583962 583327 588449 589548 592971 593708 590833 589355 593307 597375 593436 593263 595467 593816 589123 584810 583913 582471 578112 579438 581309 580120 579671 578768 579384 585698 593289 596228 593006 592026 585355 584327 582794 587606 589309...
result:
wrong answer
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Time Limit Exceeded
Test #11:
score: 0
Time Limit Exceeded
input:
200000 0 2 2 0 2 2 0 1 1 0 2 2 0 1 2 2 0 1 0 2 1 1 0 1 0 2 0 2 0 0 0 1 0 0 2 0 2 1 0 0 1 1 1 0 0 2 1 2 2 1 0 2 2 2 0 2 2 1 2 0 1 0 0 1 2 0 0 2 1 1 1 0 1 1 1 2 1 0 1 1 0 1 2 2 2 0 1 0 1 1 0 2 0 1 0 2 0 0 2 2 2 2 2 0 0 2 1 2 2 1 2 0 1 1 1 1 1 0 2 0 2 0 1 1 1 0 1 0 2 1 2 0 1 1 0 2 1 2 2 2 0 0 2 2 2 0 1...
output:
result:
Subtask #4:
score: 0
Time Limit Exceeded
Test #38:
score: 16
Accepted
time: 7ms
memory: 27832kb
input:
3 1 1 1 0 1 1 2 100 2 0 0 0 0 2 2 1 0 1 0 0 0 1 0 0 1 0 2 2 0 1 0 0 0 1 1 1 0 0 2 0 2 1 2 2 0 2 2 1 2 2 2 0 0 1 2 1 0 2 0 1 2 0 2 1 0 0 2 0 2 1 2 2 0 2 2 0 0 0 2 1 2 0 2 2 1 2 0 1 1 1 2 1 0 0 0 2 0 1 0 0 1 2 1 0 1 2 1 0 0 1 2 2 2 1 2 2 0 2 1 2 2 1 0 0 0 2 0 1 1 1 2 0 0 0 1 2 0 2 0 0 1 0 0 1 0 2 2 1 ...
output:
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0
result:
ok
Test #39:
score: 16
Accepted
time: 0ms
memory: 27536kb
input:
4 2 2 2 0 0 1 1 2 2 3 100 0 0 3 2 1 1 3 1 0 2 2 0 1 0 3 0 0 1 1 2 0 0 3 2 3 1 1 0 3 2 3 0 3 1 1 2 3 2 0 1 2 2 2 1 1 0 1 1 1 0 3 0 0 2 1 2 0 0 3 1 1 0 2 0 3 0 2 2 3 2 0 2 0 1 3 1 2 1 3 0 1 2 2 2 3 2 2 1 1 1 3 1 1 2 2 0 0 2 1 1 0 1 3 0 2 2 0 2 0 0 1 0 3 1 2 1 0 2 2 2 0 0 0 1 3 0 2 1 1 2 3 1 3 2 1 1 2 ...
output:
0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok
Test #40:
score: 16
Accepted
time: 6ms
memory: 26656kb
input:
5 0 1 0 2 1 0 1 1 2 2 3 3 4 100 1 0 4 2 3 1 2 2 2 0 4 1 1 2 3 0 3 2 3 1 1 0 1 2 2 2 4 2 1 1 4 0 2 0 0 2 2 1 0 1 3 2 1 0 4 1 3 0 4 0 3 2 2 0 0 0 2 1 0 2 0 1 4 1 3 0 0 2 4 2 2 0 2 1 4 0 1 2 4 1 1 0 3 2 0 0 2 0 2 2 4 2 3 1 3 0 0 2 1 2 0 0 2 1 3 2 2 0 2 2 0 1 2 0 3 1 0 0 4 0 2 2 1 0 2 1 3 2 4 2 1 1 4 1 ...
output:
1 0 0 3 2 3 0 0 0 0 0 0 0 0 1 3 2 0 3 3 0 0 1 1 0 0 1 0 0 2 2 1 1 0 1 2 0 2 2 4 2 1 1 2 0 0 0 2 0 0 0 0 2 2 0 0 0 0 1 2 1 2 1 0 2 4 4 2 1 2 4 2 0 2 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 1 0 0 0 3 0 0 2
result:
ok
Test #41:
score: 16
Accepted
time: 0ms
memory: 26864kb
input:
6 0 1 2 0 1 2 0 1 1 2 2 3 3 4 4 5 100 2 1 5 1 5 2 1 2 2 2 3 2 2 1 0 2 3 1 3 0 0 1 0 0 3 2 5 1 4 2 1 0 0 1 5 0 1 2 5 1 5 2 4 0 0 0 0 2 2 2 0 0 1 0 2 0 0 1 1 2 2 2 2 0 2 1 1 1 4 1 3 0 1 0 3 1 0 0 5 0 1 1 2 0 2 1 2 0 4 2 3 0 1 2 4 0 2 1 3 1 3 2 2 2 3 0 4 1 5 1 5 0 4 2 3 2 2 1 4 0 5 1 2 0 1 1 1 0 4 1 3 ...
output:
4 4 0 4 4 2 1 3 0 0 3 2 4 3 1 2 4 2 2 1 0 0 1 3 2 0 0 0 0 0 0 0 0 1 0 0 1 3 3 6 0 0 0 0 0 3 1 0 0 3 4 3 0 0 2 0 2 0 0 3 3 2 0 1 0 0 0 0 4 4 3 4 4 4 3 2 2 2 3 0 0 2 0 0 0 0 0 0 2 4 3 2 1 0 1 0 0 1 2 3 6
result:
ok
Test #42:
score: 16
Accepted
time: 4ms
memory: 26772kb
input:
400 0 2 2 1 0 2 2 1 2 0 1 2 0 0 2 1 2 0 1 0 2 2 0 2 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 2 1 2 2 1 0 1 1 2 0 1 2 0 2 1 2 1 1 2 1 1 0 1 0 2 2 2 2 1 0 1 0 0 0 2 2 0 2 1 1 0 0 0 1 1 1 0 0 2 0 0 2 0 1 2 1 1 0 1 2 1 0 1 0 1 1 0 1 2 0 1 0 2 2 1 0 0 1 0 2 1 2 0 1 1 1 0 1 1 0 1 0 2 0 1 1 2 0 2 2 2 2 2 0 1 0 0 2 2 ...
output:
748492 751280 745592 746546 748685 749066 748286 746439 742602 741927 739801 738044 740003 732801 732137 732791 741037 740750 744502 744511 744015 746300 749460 745730 745106 751192 750538 754769 756253 757792 760457 756172 757024 761186 760814 761345 762058 764833 769148 767330 764502 764339 767930...
result:
ok
Test #43:
score: 16
Accepted
time: 101ms
memory: 28884kb
input:
4000 1 1 1 2 0 2 2 1 1 2 0 1 0 1 2 0 1 1 1 1 1 0 0 0 2 2 1 2 2 0 1 2 0 0 2 0 1 0 2 1 2 0 0 0 0 2 0 2 2 1 0 2 2 2 2 1 0 2 1 0 1 1 2 1 0 0 0 2 1 1 0 1 0 1 2 2 2 1 0 1 2 0 2 2 1 2 1 0 1 1 0 1 0 0 2 0 2 2 1 0 1 2 0 2 1 1 0 2 1 2 2 0 0 0 1 2 0 2 1 2 0 0 2 1 1 2 1 1 0 2 1 0 2 0 1 1 0 0 0 0 2 0 2 1 2 0 0 2...
output:
791220194 791202818 791448703 790793734 790538710 790399232 790680228 790274544 789587326 789569532 789589951 789568904 789520169 789458372 789475557 788952064 788936826 788957112 788606079 788625706 788314564 788853784 788476658 788033878 787760817 787604725 787949498 787930696 787950912 787946164 ...
result:
ok
Test #44:
score: 0
Time Limit Exceeded
input:
200000 1 2 0 2 1 2 1 1 0 1 1 1 0 1 2 0 2 1 2 1 1 0 0 0 0 2 2 2 0 0 1 1 1 2 1 0 0 2 2 0 2 1 0 2 0 0 1 1 2 2 0 2 0 0 1 1 2 2 0 2 1 1 1 1 0 2 0 1 1 0 2 0 0 2 1 0 2 2 2 0 0 2 0 2 0 2 2 1 2 1 1 2 0 1 0 0 2 0 2 2 1 0 0 2 1 0 2 0 2 1 0 2 1 0 2 0 0 0 0 0 2 0 0 2 2 1 0 2 0 2 1 2 1 2 2 2 0 2 0 0 0 0 2 1 0 0 1...
output:
result:
Subtask #5:
score: 0
Wrong Answer
Test #60:
score: 16
Accepted
time: 6ms
memory: 27600kb
input:
3 2 0 0 0 1 0 2 100 0 1 2 2 2 1 1 1 0 0 2 2 1 2 0 2 0 1 0 0 0 1 0 2 2 1 1 0 2 2 2 0 0 0 0 2 1 1 1 2 2 2 2 1 0 0 2 2 0 1 1 0 0 0 2 0 1 1 1 0 2 1 2 0 0 2 0 1 2 2 1 1 0 0 0 1 2 1 0 0 2 0 0 1 2 1 2 0 0 2 2 2 0 1 2 0 0 0 0 1 2 1 0 2 0 1 0 2 2 2 1 0 1 1 1 2 1 0 1 2 1 0 0 0 1 1 0 1 1 0 2 0 1 2 1 0 0 2 0 0 ...
output:
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok
Test #61:
score: 16
Accepted
time: 0ms
memory: 26732kb
input:
4 1 0 1 0 0 1 0 2 1 3 100 0 2 3 2 1 1 0 1 3 1 3 2 3 1 2 2 1 2 2 1 1 0 2 2 3 2 3 1 1 1 3 2 2 0 3 1 0 2 1 2 2 1 2 2 0 1 1 0 3 0 3 2 3 1 3 0 0 0 2 0 1 1 1 2 0 1 1 0 2 2 2 1 1 1 3 2 0 0 2 2 0 1 3 1 1 0 2 1 2 0 1 2 0 2 3 0 3 1 0 1 0 2 3 2 3 1 1 1 1 0 2 2 0 0 0 1 0 0 0 1 0 0 2 0 0 1 3 2 0 2 3 0 2 2 2 1 3 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 2 0 0 0 0 0 0 1 2 1 1 2 0 0 0 0 1 0 2 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok
Test #62:
score: 16
Accepted
time: 0ms
memory: 26724kb
input:
5 1 0 0 1 1 0 1 0 2 1 3 1 4 100 0 0 0 2 1 1 3 0 3 2 1 0 2 1 0 0 1 2 4 0 0 2 1 0 2 0 1 1 1 0 1 2 3 0 1 0 0 1 0 0 4 1 4 2 3 1 2 1 4 0 3 2 3 1 2 0 2 1 2 0 0 2 2 1 0 0 2 2 1 1 0 2 3 2 4 2 1 2 2 1 0 0 2 0 1 0 0 1 2 2 3 0 3 2 2 0 0 2 1 2 3 1 2 1 4 1 2 2 0 0 0 2 1 0 2 1 4 0 1 2 1 0 1 2 2 0 2 1 0 0 4 1 1 0 ...
output:
0 0 0 0 1 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0 0 0 0 0 0 2 1 2 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 2 0 0 2 1 0 1 3 0 0 0 0 0 0 0 0 0 1 2 0
result:
ok
Test #63:
score: 0
Wrong Answer
time: 0ms
memory: 24908kb
input:
6 2 1 0 2 1 2 0 1 0 2 1 3 1 4 2 5 100 5 1 4 0 3 1 5 2 4 2 2 1 2 0 2 1 5 0 3 0 4 1 0 1 4 0 1 0 0 0 1 1 5 1 4 2 0 1 1 2 3 1 3 2 0 2 1 0 3 0 1 2 1 0 1 1 1 2 4 1 2 0 1 0 5 0 0 0 5 1 5 0 1 2 0 2 5 2 0 0 3 2 3 0 3 2 3 1 0 2 4 0 5 1 4 1 3 0 5 2 3 1 4 0 1 1 5 1 2 2 5 2 5 1 3 2 0 0 0 1 4 2 2 0 5 2 1 0 3 1 2 ...
output:
1 1 3 1 2 1 0 1 0 3 5 2 -1 -1 -1 0 0 0 2 0 -1 -1 -1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 2 3 2 3 3 2 -1 3 3 2 1 1 1 0 -1 -1 -1 1 1 1 3 1 3 1 2 0 0 0 0 0 0 3 3 3 2 1 1 1 0 0 3 0 0 0 0 0
result:
wrong answer
Subtask #6:
score: 0
Skipped
Dependency #2:
0%
Subtask #7:
score: 0
Skipped
Dependency #1:
0%