Submission #1225500

#TimeUsernameProblemLanguageResultExecution timeMemory
1225500TrumlingTree (IOI24_tree)C++20
0 / 100
2097 ms33868 KiB
//Trumling ©
//Αφόδευε υψηλά και ηγνάντει 
#include <bits/stdc++.h>
using namespace std; 
 
typedef long long ll;
#define pb push_back
#define F first
#define S second
#define enter cout<<'\n';
#define INF 99999999999999
#define MOD 1000000007
#define all(x) x.begin(),x.end()
 
#include "tree.h"

int n;
vector<ll>  w;
vector<ll>f;
vector<vector<ll>>g;
//vector<priority_queue<pair<ll,ll>>>v;
ll ans=0;
priority_queue<pair<ll,ll>>pq;
void dfs2(int start,int pre,int L,int R)
{
  for(auto x:g[start])
    if(x!=pre)
    {
      dfs2(x,start,L,R);
      if(f[x]>L)
      pq.push({-w[x],x});
    }
}

void dfs(int start,int pre,int L,int R)
{
  for(auto x:g[start])
    if(x!=pre)
    {
      dfs(x,start,L,R);
      f[start]+=f[x];
    }

  dfs2(start,pre,L,R);

  if(f[start]==0)
    {
      f[start]=L;
      ans+=w[start]*L;
    }

  if(f[start]>L)
    pq.push({-w[start],start});

  while(f[start]>R)
  {
    ll can=f[pq.top().S]-L;
    ll must=f[start]-R;

    if(can>must)
    {
      if(pq.top().S!=start)
        f[pq.top().S]-=must;

      f[start]-=must;
      ans+=must*(-pq.top().F);
    }
    else
    {
      if(pq.top().S!=start)
        f[pq.top().S]-=can;

      f[start]-=can;
      ans+=can*(-pq.top().F);
      pq.pop();
    }
  }

  while(!pq.empty())
    pq.pop();
}

void init(std::vector<int> p, std::vector<int> W) {
  
  for(auto x:W)
    w.pb(x);

  n = (int)p.size();
  g.assign(n,vector<ll>());

  for(int i=1;i<n;i++)
    {
     // cout<<i<<' '<<p[i]<<',';
      g[i].pb(p[i]);
      g[p[i]].pb(i);
    }
}

long long query(int L, int R) 
{
  ans=0;
  f.assign(n,0);
 // v.assign(n,priority_queue<pair<ll,ll>>());
  dfs(0,0,L,R);
  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...