| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 478059 | clifter | Harbingers (CEOI09_harbingers) | C++14 | 280 ms | 24024 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
struct triple{ll x, a, b;};
vector<ll> V[100500],D[105000];
vector<triple> S;
priority_queue<pair<ll, int>> pq;
ll a[100500], b[100500], xsum[100500];
ll ans[100500];
void dfs(int x){
  for(int i=0; i<V[x].size(); i++){
    if(xsum[V[x][i]]==0&&V[x][i]!=1){
      xsum[V[x][i]] = xsum[x]+D[x][i];
      dfs(V[x][i]);
    }
  }
}
int main() {
  
  int n;
  cin>>n;
  for(int i=1; i<n; i++){
    int x,y,d;
    cin>>x>>y>>d;
    V[x].push_back(y);
    V[y].push_back(x);
    D[x].push_back(d);
    D[y].push_back(d);
  }
  for(int i=2; i<=n; i++) cin>>a[i]>>b[i];
  dfs(1);
  pq.push(make_pair(0, 1));
  while(!pq.empty()){
    ll val = pq.top().first;
    int node = pq.top().second;
    pq.pop();
    while(!S.empty()&&S.back().x>=val) S.pop_back();
    S.push_back(triple{val, -xsum[node], ans[node]});
    for(int i=0; i<V[node].size(); i++){
      if(ans[V[node][i]]==0&&V[node][i]!=1){
        int s = 0;
        int e = S.size()-1;
        while(s!=e){
          int m = (s+e)/2+1;
          if(S[m].x<=b[V[node][i]]) s = m;
          else e = m-1;
        }
        ans[V[node][i]] = a[V[node][i]]+b[V[node][i]]*(xsum[V[node][i]]+S[s].a)+S[s].b;
        
        s = 0;
        e = S.size()-1;
        while(s!=e){
          int m = (s+e)/2+1;
          if(S[m].a*S[m].x+S[m].b<-xsum[V[node][i]]*S[m].x+ans[V[node][i]]) s = m;
          else e = m-1;
        }
        ll x = (ans[V[node][i]]-S[s].b)/(xsum[V[node][i]]+S[s].a);
        pq.push(make_pair(x+1, V[node][i]));   
      }
    }
  }
  for(int i=2; i<=n; i++) cout<<ans[i]<<" ";
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
