Submission #1367921

#TimeUsernameProblemLanguageResultExecution timeMemory
1367921fotonoinoiRoad Closures (APIO21_roads)C++20
24 / 100
2095 ms21624 KiB
#include "roads.h"
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
vector<vector<pair<int,int>>> v(100005);
long long dp[100005][2];
void run(int x,int p,int k)
{
  int y,w;
  dp[x][0]=0;
  dp[x][1]=0;
  for(int i=0;i<v[x].size();i++)
  {
    y=v[x][i].s;
    if(y==p)
      continue;
    run(y,x,k);
  }
  vector<long long> sorta;
  for(int i=0;i<v[x].size();i++)
  {
    w=v[x][i].f;
    y=v[x][i].s;
    if(y==p)
      continue;
    dp[x][0]+=dp[y][0];
    dp[x][1]+=dp[y][0];
    sorta.push_back(dp[y][1]+w-dp[y][0]);
  }
  sort(sorta.begin(),sorta.end());
  int cut=sorta.size()-k;
  for(int i=0;i<sorta.size();i++)
  {
    if(i<cut)
      dp[x][1]+=sorta[i];
    else if(sorta[i]<0)
      dp[x][1]+=sorta[i];
  }  
  for(int i=0;i<sorta.size();i++)
  {
    if(i<cut+1)
      dp[x][0]+=sorta[i];
    else if(sorta[i]<0)
      dp[x][0]+=sorta[i];
  }  
  return;
}
vector<long long> minimum_closure_costs(int N,vector<int> U,vector<int> V,vector<int> W)
{
    vector<long long> ans;
    int x,y,w,p;
    for(int i=0;i<N-1;i++)
    {
      x=U[i];
      y=V[i];
      w=W[i];
      x++;
      y++;
      v[x].push_back({w,y});
      v[y].push_back({w,x});
    }
    int st;
    for(int i=1;i<=N;i++)
    {
      if(v[i].size()==1)
      {
        st=i;
        break;
      }
    }
    for(int i=0;i<N;i++)
    {
      run(st,0,i);
      ans.push_back(min(dp[st][0],dp[st][1]));
    }
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...