Submission #1201205

#TimeUsernameProblemLanguageResultExecution timeMemory
1201205NeltTree (IOI24_tree)C++20
18 / 100
63 ms24576 KiB
#include <bits/stdc++.h>
#include "tree.h"
#define ll long long
#define endl "\n"
using namespace std;
const ll N = 2e5 + 5;
int n;
vector<ll> g[N];
vector<ll> a, pa;
ll dp[N];
std::vector<int> p, w;
void dfs(ll v)
{
    dp[v] = g[v].size() == 0;
    for (ll to : g[v])
        dfs(to), dp[v] += dp[to];
    if (w[v] == 0)
    {
        for (ll to : g[v]) if (w[to]) a.push_back(dp[to]);
        dp[v] = 1;
    }
}
ll cnt = 0;

void init(std::vector<int> P, std::vector<int> W)
{
    p = P;
    n = p.size();
    w = W;
    w.insert(w.begin(), 0);
    p.insert(p.begin(), 0);
    for (ll i = 1; i <= n; i++)
    {
        p[i]++;
        g[p[i]].push_back(i);
    }
    dfs(0);
    for (ll i = 1; i <= n; i++)
        if (!g[i].size())
            cnt += w[i];
    sort(a.begin(), a.end());
    a.insert(a.begin(), 0);
    pa.push_back(0);
    for (ll i = 1; i < a.size(); i++) pa.push_back(pa.back() + a[i]);
}

long long query(int l, int r)
{
    ll pos = lower_bound(a.begin(), a.end(), (r + l - 1) / l) - a.begin() - 1;
    return (pa.back() - pa[pos]) * l + l * cnt - (pa.size() - pos - 1) * r;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...