제출 #1286941

#제출 시각아이디문제언어결과실행 시간메모리
1286941MMihalevTree (IOI24_tree)C++20
10 / 100
2096 ms20480 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include "tree.h"
using namespace std;
const int MAX_N=2e5+5;
long long w[MAX_N];
vector<int>g[MAX_N];
int deg[MAX_N];
long long sumcoef[MAX_N];
int n;
long long l,r;
long long ans;

void dfs(int u)
{
    for(int v:g[u])
    {
        dfs(v);
        sumcoef[u]+=sumcoef[v];
    }
    if(deg[u]==0)
    {
        sumcoef[u]=l;
        ans+=l*w[u];
    }
    else
    {
        if(sumcoef[u]>r)
        {
            long long dif=sumcoef[u]-r;
            ans+=dif*w[u];
            sumcoef[u]=r;
        }
    }
}
void init(std::vector<int> P, std::vector<int> W)
{
    n=P.size();
    w[0]=W[0];
    for(int i=1;i<n;i++)
    {
        w[i]=W[i];
        deg[P[i]]++;
        g[P[i]].push_back(i);
    }
}

long long query(int L, int R)
{
    l=L;
    r=R;
    ans=0;
    for(int i=0;i<n;i++)sumcoef[i]=0;
    dfs(0);
    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...