답안 #1044333

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1044333 2024-08-05T08:54:52 Z 정민찬(#11007) Team Coding (EGOI24_teamcoding) C++17
12 / 100
158 ms 126924 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;
            if (st[id[x]].sub.find(l[x]) != st[id[x]].sub.end())
                ans[x] -= st[id[x]].sub[l[x]];
        }
        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:173: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]
  173 |         for (ll j=1; j<t[i].size(); j++) {
      |                      ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 91476 KB Output is correct
2 Correct 31 ms 93472 KB Output is correct
3 Correct 36 ms 93364 KB Output is correct
4 Correct 44 ms 93532 KB Output is correct
5 Correct 31 ms 93528 KB Output is correct
6 Correct 39 ms 93532 KB Output is correct
7 Correct 31 ms 93532 KB Output is correct
8 Correct 40 ms 94036 KB Output is correct
9 Correct 158 ms 125012 KB Output is correct
10 Correct 37 ms 93532 KB Output is correct
11 Correct 31 ms 94036 KB Output is correct
12 Correct 121 ms 122824 KB Output is correct
13 Correct 32 ms 93528 KB Output is correct
14 Correct 39 ms 94156 KB Output is correct
15 Correct 133 ms 126116 KB Output is correct
16 Correct 37 ms 93476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 91476 KB Output is correct
2 Correct 36 ms 93596 KB Output is correct
3 Correct 44 ms 93520 KB Output is correct
4 Correct 33 ms 94036 KB Output is correct
5 Correct 82 ms 122708 KB Output is correct
6 Correct 36 ms 93524 KB Output is correct
7 Correct 31 ms 94052 KB Output is correct
8 Correct 97 ms 126924 KB Output is correct
9 Correct 48 ms 93520 KB Output is correct
10 Correct 30 ms 93784 KB Output is correct
11 Correct 96 ms 113272 KB Output is correct
12 Incorrect 60 ms 103120 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 91408 KB Output is correct
2 Correct 46 ms 93528 KB Output is correct
3 Correct 34 ms 93588 KB Output is correct
4 Correct 30 ms 93784 KB Output is correct
5 Correct 32 ms 93528 KB Output is correct
6 Correct 44 ms 93532 KB Output is correct
7 Correct 33 ms 93528 KB Output is correct
8 Correct 139 ms 125012 KB Output is correct
9 Correct 45 ms 93532 KB Output is correct
10 Correct 43 ms 94236 KB Output is correct
11 Correct 121 ms 126076 KB Output is correct
12 Correct 35 ms 93444 KB Output is correct
13 Correct 27 ms 93388 KB Output is correct
14 Correct 33 ms 93520 KB Output is correct
15 Incorrect 40 ms 97000 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 91484 KB Output is correct
2 Correct 29 ms 93596 KB Output is correct
3 Correct 38 ms 93360 KB Output is correct
4 Correct 35 ms 93508 KB Output is correct
5 Correct 39 ms 93532 KB Output is correct
6 Correct 33 ms 93480 KB Output is correct
7 Correct 40 ms 93560 KB Output is correct
8 Correct 43 ms 94208 KB Output is correct
9 Correct 32 ms 93588 KB Output is correct
10 Correct 37 ms 94032 KB Output is correct
11 Correct 34 ms 93520 KB Output is correct
12 Correct 31 ms 94040 KB Output is correct
13 Correct 36 ms 93652 KB Output is correct
14 Correct 36 ms 94176 KB Output is correct
15 Correct 37 ms 93520 KB Output is correct
16 Correct 41 ms 93780 KB Output is correct
17 Correct 33 ms 93532 KB Output is correct
18 Incorrect 35 ms 93404 KB Output isn't correct
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 91476 KB Output is correct
2 Correct 31 ms 93472 KB Output is correct
3 Correct 36 ms 93364 KB Output is correct
4 Correct 44 ms 93532 KB Output is correct
5 Correct 31 ms 93528 KB Output is correct
6 Correct 39 ms 93532 KB Output is correct
7 Correct 31 ms 93532 KB Output is correct
8 Correct 40 ms 94036 KB Output is correct
9 Correct 158 ms 125012 KB Output is correct
10 Correct 37 ms 93532 KB Output is correct
11 Correct 31 ms 94036 KB Output is correct
12 Correct 121 ms 122824 KB Output is correct
13 Correct 32 ms 93528 KB Output is correct
14 Correct 39 ms 94156 KB Output is correct
15 Correct 133 ms 126116 KB Output is correct
16 Correct 37 ms 93476 KB Output is correct
17 Correct 41 ms 91476 KB Output is correct
18 Correct 36 ms 93596 KB Output is correct
19 Correct 44 ms 93520 KB Output is correct
20 Correct 33 ms 94036 KB Output is correct
21 Correct 82 ms 122708 KB Output is correct
22 Correct 36 ms 93524 KB Output is correct
23 Correct 31 ms 94052 KB Output is correct
24 Correct 97 ms 126924 KB Output is correct
25 Correct 48 ms 93520 KB Output is correct
26 Correct 30 ms 93784 KB Output is correct
27 Correct 96 ms 113272 KB Output is correct
28 Incorrect 60 ms 103120 KB Output isn't correct
29 Halted 0 ms 0 KB -