제출 #246435

#제출 시각아이디문제언어결과실행 시간메모리
246435alradPutovanje (COCI20_putovanje)C++17
110 / 110
139 ms26712 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(x) x.begin(), x.end()

const int N = 2e5 + 2;
const int LOG = 19;

int L = 1 , timer = 0;
int tin[N] , tout[N] , c[N] , d[N];
int up[N][LOG] , cnt[N] , p[N] , dp[N];
vector<vector<pair<int , int> > > g(N , vector<pair<int , int> >());

void dfs1(int v , int p = 1) {
   tin[v] = ++timer;
   up[v][0] = p;
   for (int i = 1; i <= L; i++) {
      up[v][i] = up[up[v][i - 1]][i - 1];
   }
   for (auto e : g[v]) {
      int to = e.first;
      int pos = e.second;
      if (to != p) {
         dfs1(to , v);
      }
   }
   tout[v] = ++timer;
}

bool ancestor(int a , int b) {
   return tin[a] <= tin[b] && tout[a] >= tout[b];
}

int lca(int a , int b) {
   if (ancestor(a , b)) {
      return a;
   }
   if (ancestor(b , a)) {
      return b;
   }
   for (int i = L; i >= 0; --i) {
      if (!ancestor(up[a][i] , b)) {
         a = up[a][i];
      }
   }
   return up[a][0];
}

void dfs(int v , int par = -1 , int in = -1) {
   for (auto e : g[v]) {
      int to = e.first;
      int edgeNum = e.second;
      if (to != par) {
         dfs(to , v , edgeNum);
         dp[v] += dp[to];
      }
   }
   dp[v] += p[v];
   if (in != -1) {
      cnt[in] = dp[v];
   }
}

int main() {
   #ifdef judge
      ifstream cin("input.txt");
   #endif // judge
   ios_base :: sync_with_stdio(0);
   cin.tie(0) , cout.tie(0);
   int n;
   cin >> n;
   while ((1 << L) <= n) {
      L++;
   }
   for (int i = 0; i < n - 1; i++) {
      int u , v;
      cin >> u >> v >> c[i] >> d[i];
      g[u].push_back({v , i});
      g[v].push_back({u , i});
   }
   dfs1(1);
   for (int i = 1; i < n; i++) {
      int anc = lca(i , i + 1);
      p[i]++ , p[i + 1]++;
      p[anc] -= 2;
   }
   dfs(1 , -1);
   long long ans = 0LL;
   for (int i = 0; i < n - 1; i++) {
      ans += min(c[i] * 1LL * cnt[i] , 1LL * d[i]);
   }
   cout << ans << '\n';
   return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

putovanje.cpp: In function 'void dfs1(int, int)':
putovanje.cpp:23:11: warning: unused variable 'pos' [-Wunused-variable]
       int pos = e.second;
           ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...