제출 #1330091

#제출 시각아이디문제언어결과실행 시간메모리
1330091TraianDanciuHarbingers (CEOI09_harbingers)C++20
100 / 100
129 ms17164 KiB
/*
⢸⠇⠀⡠⠴⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⣙⣛⡋⡋⠑⠀⠀⠀⠀⠀⠀⣠⣤⡶⢛⣩⣽⠛⠛⠛⠓⢦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣶⣞⠇⠳⡄⠀⠀⡾⠀⠀⠀⠀⠀⠀
⢸⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠻⠻⠋⠟⢦⠀⠄⠀⠀⣴⣞⣵⡟⣴⣿⠟⢠⡶⠋⠉⠀⠀⠉⠳⣦⡀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⠁⠀⢱⣄⠀⠁⠀⠀⠀⠀⠀⠀
⢸⠀⠀⡀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣤⠀⡆⣰⢀⣀⢠⣶⣿⣿⣿⣼⣿⡏⣰⣿⣾⣶⣄⠀⢠⠀⠀⠀⠻⣆⠀⠀⠀⠀⠀⣼⠿⢛⠋⣤⣀⣾⣽⡆⠀⠀⠀⠀⠀⠀⠀
⢸⠀⠀⠀⡴⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⢠⠀⡀⠤⠀⠀⢰⣿⣿⡏⣿⣿⣿⣷⣿⣿⣿⣿⣷⣄⣘⣇⠀⠀⠀⠘⣦⠀⠀⠀⠀⠈⠛⠛⠿⣿⣿⣿⠿⢷⣄⣶⣄⠀⠀⠀⠀
⣼⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣉⠉⠀⡁⠀⢀⡁⣀⣿⠟⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠘⣧⡀⠀⠀⠀⠀⠀⠀⣼⠷⠶⣶⠲⠼⣿⣿⡳⡀⠀⠀
⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠚⠘⠃⠀⢻⡼⠏⢀⢀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⢻⠛⠲⠦⣄⡀⠀⢿⣷⣶⣭⠉⢻⡒⠀⠀⠙⠃⠀⠀
⡇⠀⠀⠀⠙⠀⠀⠀⠀⠀⠀⡄⠀⠀⠀⠀⠀⡝⢶⠀⠂⠀⣿⠀⠀⢸⡏⣑⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢛⣻⣿⣿⣿⡿⠛⠀⠀⠶⣺⠇⠀⠈⠁⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡇⠀⠠⠀⢠⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⢖⠠⠀⠀⠀⢼⣄⠀⠈⠇⠉⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠩⠒⠀⣀⣴⠊⢙⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡇⠂⢸⠀⠸⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⣈⠀⠀⠀⣀⡀⢹⡀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠁⠀⢀⣠⣴⣾⣿⣿⣿⡟⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡇⠀⢨⠀⠚⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⢠⣶⡟⢛⣾⣷⣶⢺⣶⣿⣿⣿⣿⣿⣿⠿⠛⠉⠀⢀⣤⣴⣾⣿⣿⣿⢿⣿⣿⣿⢠⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡇⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠰⣿⣿⣴⣿⣿⣿⣥⣾⣿⣿⣿⣿⠟⣋⣥⣤⣶⣶⣿⣿⣿⣿⣿⣿⣿⠁⠘⠿⣿⣏⠟⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣤
⡇⠀⠐⠀⠸⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠉⡏⢹⢋⠛⠛⠛⠛⠙⣿⠛⡿⣿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠲⠚⠉⢀⢻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀
⡇⠀⠀⠀⠀⠀⠀⡄⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡦⢼⣿⠿⢶⣦⣀⣿⣦⣀⣴⣾⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⠂⠀⢀⣀⡀⣸⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀
⡇⠁⠀⠀⠈⠀⠀⡷⠿⠿⠾⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡄⠀⢻⡀⠈⠻⣿⣿⠋⣿⣅⠈⠻⠿⠋⣸⣿⡿⠉⠀⣿⣿⠀⠀⣿⣿⣿⣽⢿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀
⡇⠀⠀⠀⢰⠠⠀⣇⠀⣳⣔⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣄⣀⠙⢶⢴⣿⣟⣀⣸⣿⣷⣦⣶⣛⣿⡿⠁⠀⠀⣿⣿⠀⠀⣿⣿⣿⣿⡿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⡇⠀⠀⠀⢸⣿⢀⣿⣷⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡼⣿⡇⠀⠸⣿⣿⣿⣿⣿⣿⣿⡟⠋⠉⣾⣿⣷⢀⣿⣿⣷⠆⠻⢿⣿⢟⡅⢱⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡇⠀⠀⠀⢸⢸⣷⣝⠻⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣷⡀⠀⣠⡶⢿⣿⡟⢿⣿⣿⣿⣿⣷⣦⣙⠛⠋⣼⣿⣿⣷⡄⣰⣾⣿⡿⠋⣉⣙⢲⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈
⡇⠀⠀⠀⠈⠈⢻⣿⣷⣜⢯⣓⢶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠟⣹⣶⣾⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣟⠿⣳⣿⣿⣿⣿⣯⠍⠉⠑⢿⣿⣧⣀⣀⡒⠂⠈⠲⠤⠗
⡇⠀⠀⠀⣰⠀⠈⢿⣿⡝⢷⣍⠳⣬⡙⠳⢯⣤⣤⣤⣤⡤⠄⠹⣃⣾⣿⣿⣿⣷⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⠿⣽⣿⣿⣻⣭⠖⠚⠀⠀⠀⠘⣿⣿⣿⣿⣿⣽⣿⣿⣿
⡇⠀⠀⠀⢸⡇⠀⡞⢿⣷⣄⠙⠳⣄⠉⠷⣄⣈⠛⢧⣤⣴⣽⣷⡝⢻⣿⣕⣽⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⣋⣭⠶⠖⠂⠀⠀⠀⠀⣻⡇⠉⠩⠿⠿⠿⠿⠿
⡇⠀⠀⠀⠸⠀⠀⡇⠈⣿⣿⡀⠀⠈⠻⣦⡈⣹⣿⠿⢿⣿⣿⣿⣿⣉⣝⣾⠓⣲⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣋⣁⠀⠶⠶⠶⠚⠙⡇⢠⣿⣥⠭⠿⠶⠶⠶⠶⠖
⡧⠶⢶⠒⢾⡇⠀⡇⠀⠘⣿⣿⣤⠀⠀⠈⠻⡟⠁⠀⢸⣿⣿⣿⣿⣿⣿⣿⣾⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣅⣀⡀⠙⢿⣿⣯⣄⠀⠀⠀⠀⢀⣡⣾⣿⣶⣶⣿⣿⣿⣿⣿⣿
⣧⠀⢸⣀⣸⡇⠀⠃⠀⠀⠘⣿⣿⣇⠀⠀⠀⣿⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠉⠉⠛⣿⣿⣻⣦⡈⢿⡽⣿⣧⠀⠀⢠⣬⣿⣿⣛⣉⣉⣉⣀⣠⣤⣤⣤
⣿⠀⢈⠈⢸⡇⠀⠀⠀⠀⠀⡘⢿⣿⣧⡀⢠⡏⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠛⠉⠉⠀⢀⣀⠀⠀⣀⣠⣿⣿⣿⣿⣷⣌⣿⢘⣿⣾⣦⣿⣿⣿⣤⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⠛⠠⢀⣰⡇⠀⠀⠀⠀⠀⠃⠈⢿⣿⣿⣿⠀⢻⣿⣿⣿⣿⣿⠻⣿⠟⢭⣀⣀⣀⣀⣤⣤⣶⣾⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⠉⠉⢀⣀⣀
⣿⣠⠼⠛⠙⡇⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣯⣤⣾⣿⣿⣿⣿⣿⡾⠋⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣾⣿⣿⣿⣿
⣿⠉⠀⢀⡀⡇⠀⠀⠀⠀⠀⠄⠀⠀⠈⢿⣿⣿⣏⣿⣿⣿⣿⡿⠀⢀⣸⢻⣿⣿⣿⣿⣿⣿⠿⠿⢿⣿⣶⣶⣶⣾⣿⣿⠿⠿⣿⣭⣭⣹⠿⣿⣿⣽⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿
⣿⠀⠈⠷⠁⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⡿⠀⠀⣿⣿⣿⣿⣿⢟⠀⣻⣿⣿⣦⣄⠀⠀⠉⠉⠁⢀⣀⣀⡈⡻⠿⠟⠛⠀⠀⠉⠙⠿⣿⣿⣿⠿⠿⠿⠟⠛⠋⠉
⣿⡃⠀⣀⠘⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⢃⢀⢰⣿⣿⣿⣿⠏⠀⠀⢸⣿⣿⣿⣿⣿⣦⣄⠀⠴⢿⣿⣿⠿⠟⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠉⠲⢤⣠⣤⣶⣶⣶
⣿⡟⠐⡦⢀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⢸⢸⣿⣿⣿⣳⡀⠀⠀⢨⣿⣿⣿⣿⣿⣿⣿⣿⣦⣄⠀⠀⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⣿⡆⠀⠀⠀⠈⠙⠻⠿⣿
⣿⡇⠁⣦⣶⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣄⠀⢀⠈⠉⠉⠛⠛⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣿⣿⣶⡾⠿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣯⣄⣀⡀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣤⣤⡀⡀⠀
*/

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

// ifstream fin("harbingers.in");
// ofstream fout("harbingers.out");
#define fin cin
#define fout cout

const int MAXN = 100000;

struct Line {
  int a;
  long long b;
} stiva[MAXN];

int start[MAXN + 1], speed[MAXN + 1], depth[MAXN + 1], sp;
vector<pair<int, int>> g[MAXN + 1];
vector<pair<Line, int>> undo;
long long dp[MAXN + 1];

double intersect(Line l1, Line l2) {
  return (double)(l2.b - l1.b) / (l1.a - l2.a);
}

long long query(int poz) {
  int st = 1, dr = sp - 1, answer = 0;
  while(st <= dr) {
    int mij = (st + dr) / 2;
    if(intersect(stiva[mij], stiva[mij - 1]) < poz) {
      answer = mij;
      st = mij + 1;
    } else {
      dr = mij - 1;
    }
  }
  return 1LL * stiva[answer].a * poz + stiva[answer].b;
}

void update(Line l) {
  int answer = sp;
  if(sp >= 2) {
    int st = 1, dr = sp - 1;
    while(st <= dr) {
      int mij = (st + dr) / 2;
      if(intersect(l, stiva[mij - 1]) < intersect(stiva[mij], stiva[mij - 1])) {
        answer = mij;
        dr = mij - 1;
      } else {
        st = mij + 1;
      }
    }
  }
  undo.push_back({stiva[answer], sp});
  stiva[answer] = l;
  sp = answer + 1;
}

void dfs(int node, int parent) {
  if(node == 1) {
    stiva[sp++] = {0, 0};
  } else {
    dp[node] = start[node] + 1LL * speed[node] * depth[node] + query(speed[node]);
    update({-depth[node], dp[node]});
  }
  for(auto edge : g[node]) {
    if(edge.first != parent) {
      depth[edge.first] = edge.second + depth[node];
      dfs(edge.first, node);
    }
  }
  if(node > 1) {
    stiva[sp - 1] = undo.back().first;
    sp = undo.back().second;
    undo.pop_back();
  }
}

int main() {
  int n;
  fin >> n;
  for(int i = 1; i < n; i++) {
    int u, v, w;
    fin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }

  for(int i = 2; i <= n; i++) {
    fin >> start[i] >> speed[i];
  }

  undo.reserve(n);
  dfs(1, 0);

  for(int i = 2; i <= n; i++) {
    fout << dp[i] << " ";
  }
  fout << "\n";
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...