Submission #1285468

#TimeUsernameProblemLanguageResultExecution timeMemory
1285468LuvidiTree (IOI24_tree)C++20
7 / 100
61 ms16896 KiB
#include "tree.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn=2e5;
vector<int> ch[maxn];
vector<ll> w,cl,ps;
int n,k;

int dfs(int v){
    int c=ch[v].empty();
    for(int u:ch[v]){
        c+=dfs(u);
    }
    return c;
}

void init(std::vector<int> p, std::vector<int> W) {
    n=p.size();
    for(int i:W)w.push_back(i);
    for(int i=1;i<n;i++)if(w[p[i]])ch[p[i]].push_back(i);
    cl.push_back(0);
    for(int i=0;i<n;i++)if(!i||!w[p[i]])cl.push_back(dfs(i));
    sort(cl.begin(),cl.end());
    k=cl.size()-1;
    ps.resize(k+1);
    partial_sum(cl.begin(),cl.end(),ps.begin());
}

long long query(int L, int R) {
    ll l=L,r=R;
    ll ans=0;
    int id=lower_bound(cl.begin(),cl.end(),r/l+1)-cl.begin();
    ans+=ps[id-1]*l;
    ans+=(ps[k]-ps[id-1])*2*l-r*(k-(id-1));
    return ans;
}
#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...