#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
const ll B = 2e18;
struct mySet{
map<ll,ll> sub;
deque<ll> dq;
ll sz = 0;
};
mySet st[100010];
ll id[100010];
vector<ll> g[100010];
ll dep[100010];
ll l[100010];
ll par[100010];
vector<pair<ll,ll>> vec[100010];
map<ll,ll> cnt[100010];
vector<ll> large;
ll down[100010];
void Merge(mySet &u, mySet &v, ll cdep) {
while (u.dq.size() < v.dq.size()) u.dq.push_back(0);
for (ll i=0; i<v.dq.size(); i++) {
if (vec[cdep + i].size() < B) {
for (auto &[k, col] : vec[cdep + i]) {
if (k > u.dq[i]) {
u.sub[col] -= k - u.dq[i];
}
}
}
u.dq[i] += v.dq[i];
if (vec[cdep + i].size() < B) {
for (auto &[k, col] : vec[cdep + i]) {
if (k > u.dq[i]) {
// sub.find()
u.sub[col] += k - u.dq[i];
}
}
}
}
u.sz += v.sz;
}
ll pv;
ll chk[100010];
ll ans[100010];
ll tme[100010];
ll poss[100010];
ll dfs(ll x) {
if (g[x].empty()) {
id[x] = pv ++;
st[id[x]].dq.push_back(1);
st[id[x]].sz = 1;
if (vec[dep[x]].size() < B) {
for (auto &[i, col] : vec[dep[x]]) {
if (i > 1) {
st[id[x]].sub[col] += i - 1;
}
}
}
if (!chk[l[x]]) {
poss[x] = 1;
ans[x] = 0;
}
return id[x];
}
int cur = -1;
chk[l[x]] ++;
for (auto &y : g[x]) {
int child = dfs(y);
if (cur == -1) {
cur = child;
continue;
}
if (st[cur].sz < st[child].sz) swap(cur, child);
Merge(st[cur], st[child], dep[x] + 1);
}
id[x] = cur;
st[id[x]].dq.push_front(1);
st[id[x]].sz ++;
if (vec[dep[x]].size() < B) {
for (auto &[i, col] : vec[dep[x]]) {
if (i > 1) {
st[id[x]].sub[col] += i - 1;
}
}
}
chk[l[x]] --;
if (true) {
poss[x] = 1;
if (st[id[x]].sub.find(l[x]) != st[id[x]].sub.end())
ans[x] -= st[id[x]].sub[l[x]];
for (auto &d : large) {
assert(0);
if (d < dep[x] || d > down[x]) continue;
ll temp = min(cnt[l[x]][d], st[id[x]].dq[d - dep[x]]);
ans[x] += temp;
}
}
return id[x];
}
ll in[100010], out[100010];
ll pv2;
void dfs2(ll x) {
down[x] = dep[x];
in[x] = ++pv2;
for (auto &y : g[x]) {
dep[y] = dep[x] + 1;
dfs2(y);
down[x] = max(down[x], down[y]);
}
out[x] = pv2;
}
struct Fenwick{
vector<ll> tree;
void init(ll n) {
tree.assign(n+1, 0);
}
void upd(ll i, ll v, ll n) {
while (i <= n) {
tree[i] += v;
i += i & -i;
}
}
ll qry(ll i) {
ll ret = 0;
while (i) {
ret += tree[i];
i -= i & -i;
}
return ret;
}
};
Fenwick seg;
vector<ll> t[100010];
int main() {
ios_base :: sync_with_stdio(false); cin.tie(NULL);
ll N, K;
cin >> N >> K;
for (ll i=0; i<N; i++) {
cin >> l[i];
}
for (ll i=1; i<N; i++) {
cin >> par[i];
g[par[i]].push_back(i);
}
dep[1] = 0;
dfs2(0);
ll mxdep = 0;
for (ll i=0; i<N; i++) {
t[dep[i]].push_back(l[i]);
mxdep = max(mxdep, dep[i]);
}
for (ll i=0; i<=mxdep; i++) {
assert(!t[i].empty());
sort(t[i].begin(), t[i].end());
vec[i].push_back({1, t[i][0]});
for (ll j=1; j<t[i].size(); j++) {
if (t[i][j] != vec[i].back().second) {
vec[i].push_back({1, t[i][j]});
}
else vec[i].back().first ++;
}
}
for (ll i=0; i<=mxdep; i++) {
if (vec[i].size() < B) {
for (auto &[j, col] : vec[i]) {
cnt[col][i] = j;
}
}
else {
large.push_back(i);
}
}
dfs(0);
vector<vector<ll>> qrs(K);
for (ll i=0; i<N; i++) {
if (vec[dep[i]].size() < B)
qrs[l[i]].push_back(i);
}
seg.init(mxdep + 1);
for (ll i=0; i<K; i++) {
for (auto &j : qrs[i]) {
seg.upd(dep[j]+1, 1, mxdep+1);
}
for (auto &j : qrs[i]) {
if (poss[j]) {
ans[j] += seg.qry(down[j]+1) - seg.qry(dep[j]);
}
}
for (auto &j : qrs[i]) {
seg.upd(dep[j]+1, -1, mxdep+1);
}
}
seg.init(N);
for (ll i=0; i<K; i++) {
for (auto &j : qrs[i]) {
seg.upd(in[j], 1, N);
}
for (auto &j : qrs[i]) {
if (poss[j]) {
tme[j] = ans[j] - (seg.qry(out[j]) - seg.qry(in[j]-1));
}
}
for (auto &j : qrs[i]) {
seg.upd(in[j], -1, N);
}
}
ll mx = -1, mn = 0;
for (ll i=0; i<N; i++) {
if (poss[i]) {
if (mx < ans[i]) {
mx = ans[i];
mn = tme[i];
}
else if (mx == ans[i] && mn > tme[i]) {
mn = tme[i];
}
}
}
cout << mx << ' ' << mn << '\n';
return 0;
}
Compilation message
Main.cpp: In function 'void Merge(mySet&, mySet&, ll)':
Main.cpp:29:19: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::deque<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | for (ll i=0; i<v.dq.size(); i++) {
| ~^~~~~~~~~~~~
Main.cpp: In function 'int main()':
Main.cpp:172:23: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
172 | for (ll j=1; j<t[i].size(); j++) {
| ~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
91472 KB |
Output is correct |
2 |
Correct |
35 ms |
93532 KB |
Output is correct |
3 |
Correct |
41 ms |
93384 KB |
Output is correct |
4 |
Correct |
34 ms |
93536 KB |
Output is correct |
5 |
Correct |
43 ms |
93532 KB |
Output is correct |
6 |
Correct |
37 ms |
93524 KB |
Output is correct |
7 |
Correct |
35 ms |
93568 KB |
Output is correct |
8 |
Correct |
31 ms |
94160 KB |
Output is correct |
9 |
Correct |
122 ms |
123216 KB |
Output is correct |
10 |
Correct |
35 ms |
93548 KB |
Output is correct |
11 |
Correct |
31 ms |
94160 KB |
Output is correct |
12 |
Correct |
89 ms |
121156 KB |
Output is correct |
13 |
Correct |
36 ms |
93572 KB |
Output is correct |
14 |
Correct |
30 ms |
94216 KB |
Output is correct |
15 |
Correct |
109 ms |
124564 KB |
Output is correct |
16 |
Correct |
42 ms |
93524 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
45 ms |
91400 KB |
Output is correct |
2 |
Correct |
31 ms |
93528 KB |
Output is correct |
3 |
Correct |
38 ms |
93532 KB |
Output is correct |
4 |
Correct |
36 ms |
94040 KB |
Output is correct |
5 |
Correct |
87 ms |
121028 KB |
Output is correct |
6 |
Correct |
33 ms |
93520 KB |
Output is correct |
7 |
Correct |
33 ms |
94032 KB |
Output is correct |
8 |
Correct |
94 ms |
126888 KB |
Output is correct |
9 |
Correct |
33 ms |
93620 KB |
Output is correct |
10 |
Correct |
36 ms |
93780 KB |
Output is correct |
11 |
Correct |
119 ms |
112504 KB |
Output is correct |
12 |
Incorrect |
53 ms |
103152 KB |
Output isn't correct |
13 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
91440 KB |
Output is correct |
2 |
Correct |
35 ms |
93372 KB |
Output is correct |
3 |
Correct |
39 ms |
93496 KB |
Output is correct |
4 |
Correct |
36 ms |
93464 KB |
Output is correct |
5 |
Correct |
30 ms |
93576 KB |
Output is correct |
6 |
Correct |
34 ms |
93532 KB |
Output is correct |
7 |
Correct |
34 ms |
93648 KB |
Output is correct |
8 |
Correct |
131 ms |
123328 KB |
Output is correct |
9 |
Correct |
35 ms |
93592 KB |
Output is correct |
10 |
Correct |
36 ms |
94164 KB |
Output is correct |
11 |
Correct |
128 ms |
124504 KB |
Output is correct |
12 |
Correct |
45 ms |
93524 KB |
Output is correct |
13 |
Correct |
33 ms |
93532 KB |
Output is correct |
14 |
Incorrect |
36 ms |
93584 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
40 ms |
91344 KB |
Output is correct |
2 |
Correct |
34 ms |
93388 KB |
Output is correct |
3 |
Correct |
37 ms |
93468 KB |
Output is correct |
4 |
Correct |
35 ms |
93532 KB |
Output is correct |
5 |
Correct |
36 ms |
93564 KB |
Output is correct |
6 |
Correct |
32 ms |
93528 KB |
Output is correct |
7 |
Correct |
36 ms |
93604 KB |
Output is correct |
8 |
Correct |
51 ms |
94032 KB |
Output is correct |
9 |
Correct |
35 ms |
93532 KB |
Output is correct |
10 |
Correct |
32 ms |
94008 KB |
Output is correct |
11 |
Correct |
34 ms |
93532 KB |
Output is correct |
12 |
Correct |
37 ms |
94036 KB |
Output is correct |
13 |
Correct |
36 ms |
93584 KB |
Output is correct |
14 |
Correct |
28 ms |
94036 KB |
Output is correct |
15 |
Correct |
33 ms |
93568 KB |
Output is correct |
16 |
Correct |
33 ms |
93788 KB |
Output is correct |
17 |
Correct |
33 ms |
93456 KB |
Output is correct |
18 |
Incorrect |
32 ms |
93528 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
91472 KB |
Output is correct |
2 |
Correct |
35 ms |
93532 KB |
Output is correct |
3 |
Correct |
41 ms |
93384 KB |
Output is correct |
4 |
Correct |
34 ms |
93536 KB |
Output is correct |
5 |
Correct |
43 ms |
93532 KB |
Output is correct |
6 |
Correct |
37 ms |
93524 KB |
Output is correct |
7 |
Correct |
35 ms |
93568 KB |
Output is correct |
8 |
Correct |
31 ms |
94160 KB |
Output is correct |
9 |
Correct |
122 ms |
123216 KB |
Output is correct |
10 |
Correct |
35 ms |
93548 KB |
Output is correct |
11 |
Correct |
31 ms |
94160 KB |
Output is correct |
12 |
Correct |
89 ms |
121156 KB |
Output is correct |
13 |
Correct |
36 ms |
93572 KB |
Output is correct |
14 |
Correct |
30 ms |
94216 KB |
Output is correct |
15 |
Correct |
109 ms |
124564 KB |
Output is correct |
16 |
Correct |
42 ms |
93524 KB |
Output is correct |
17 |
Correct |
45 ms |
91400 KB |
Output is correct |
18 |
Correct |
31 ms |
93528 KB |
Output is correct |
19 |
Correct |
38 ms |
93532 KB |
Output is correct |
20 |
Correct |
36 ms |
94040 KB |
Output is correct |
21 |
Correct |
87 ms |
121028 KB |
Output is correct |
22 |
Correct |
33 ms |
93520 KB |
Output is correct |
23 |
Correct |
33 ms |
94032 KB |
Output is correct |
24 |
Correct |
94 ms |
126888 KB |
Output is correct |
25 |
Correct |
33 ms |
93620 KB |
Output is correct |
26 |
Correct |
36 ms |
93780 KB |
Output is correct |
27 |
Correct |
119 ms |
112504 KB |
Output is correct |
28 |
Incorrect |
53 ms |
103152 KB |
Output isn't correct |
29 |
Halted |
0 ms |
0 KB |
- |