Submission #1044321

# Submission time Handle Problem Language Result Execution time Memory
1044321 2024-08-05T08:50:52 Z 정민찬(#11007) Team Coding (EGOI24_teamcoding) C++17
12 / 100
131 ms 126888 KB
#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++) {
      |                      ~^~~~~~~~~~~~
# Verdict Execution time Memory 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
# Verdict Execution time Memory 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 -
# Verdict Execution time Memory 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 -
# Verdict Execution time Memory 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 -
# Verdict Execution time Memory 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 -