Submission #1210807

#TimeUsernameProblemLanguageResultExecution timeMemory
1210807AvianshTree (IOI24_tree)C++20
0 / 100
50 ms14752 KiB
#include "tree.h"

#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> p, w;
vector<vector<int>>g;
long long pos;
long long neg;
long long lef;

void init(vector<int> P, vector<int> W) {
    p = P;
    w = W;
    n = (int)p.size();
    g=vector<vector<int>>(n,vector<int>());
    for(int i = 1;i<n;i++){
        g[p[i]].push_back(i);
    }
    lef=0;
    for(int i = 0;i<n;i++){
        if(g[i].size()==0){
            lef+=w[i];
        }
    }
    pos=0;
    neg=w[0];
    for(int i = 1;i<n;i++){
        if(w[p[i]]-w[i]<0){
            neg+=w[i]-w[p[i]];
        }
        else{
            pos+=w[p[i]]-w[i];
        }
    }
}

long long dfs(int st, int l, int r, long long c[]){
    long long belsum = 0;
    if(g[st].size()==0){
        c[st]=l;
        return l;
    }
    for(int i : g[st]){
        belsum+=dfs(i,l,r,c);
    }
    if(w[st]==1||st==0){
        c[st]=0;
        if(belsum>r){
            c[st]=-(belsum-r);
            belsum+=c[st];
        }
        return belsum;
    }
    c[st]=0;
    if(belsum>l){
        c[st]=-(belsum-l);
        belsum+=c[st];
    }
    return belsum;
}

long long query(int L, int R) {
    long long ans = pos*1LL*L-neg*1LL*R;
    ans+=2LL*lef*L;
    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...