Submission #1281069

#TimeUsernameProblemLanguageResultExecution timeMemory
1281069herominhstevePutovanje (COCI20_putovanje)C++20
110 / 110
94 ms24144 KiB
#include <bits/stdc++.h> #define el '\n' #define FNAME "PUTOVANJE" #define allof(x) x.begin(),x.end() #define allof1(x) x.begin()+1,x.end() #define mset(x,n) memset(x,(n),sizeof(x)) using namespace std; const long long MOD = (long long) 1e9 + 7; template<class X,class Y> bool minimize(X &a,Y b){ if (a>b) {a=b; return true;} return false;} template<class X,class Y> bool maximize(X &a,Y b){ if (a<b) {a=b; return true;} return false;} void setup(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); if (fopen(FNAME".inp","r")){ freopen(FNAME".inp","r",stdin); freopen(FNAME".out","w",stdout); } } const int MAXN = 2e5 + 5; const int LOG = 19; struct Edges{ int v; long long one,many; Edges(int V,long long O,long long ma):v(V),one(O),many(ma){} }; int n; vector<Edges> graph[MAXN]; vector<vector<int>> up; void init(){ cin>>n; up.assign(LOG+1,vector<int>(n+1,-1)); for (int i=1;i<n;i++){ int u,v,one,many; cin>>u>>v>>one>>many; graph[u].emplace_back(v,one,many); graph[v].emplace_back(u,one,many); } } namespace LCK{ int timedfs; int in[MAXN],out[MAXN]; void dfs(int u=1,int pre=-1){ up[0][u] = pre; in[u] = ++timedfs; for (int k=1;k<=LOG;k++){ if (~up[k-1][u]) up[k][u] = up[k-1][up[k-1][u]]; else up[k][u] = -1; } for (const Edges &x : graph[u]){ if (x.v ^ pre){ dfs(x.v,u); } } out[u] = ++timedfs; } bool isAncestor(int u,int v){ return (in[u] <= in[v] and out[u] >= out[v]); } int LCA(int u,int v){ if (isAncestor(u,v)) return u; if (isAncestor(v,u)) return v; for (int k=LOG;k>=0;k--){ if (~up[k][u] and !isAncestor(up[k][u],v)){ u = up[k][u]; } } return up[0][u]; } }; vector<long long> edgeUsed; long long res = 0; void dfs(int u=1,int pre=-1){ for (const Edges &x : graph[u]){ int v = x.v; long long many = x.many; long long once = x.one; if (v == pre) continue; dfs(v,u); res += min(edgeUsed[v] * once,many); edgeUsed[u] += edgeUsed[v]; } } void sol(){ LCK::dfs(); edgeUsed.assign(n+1,0); for (int u=1;u<n;u++){ edgeUsed[u]++; edgeUsed[u+1]++; edgeUsed[LCK::LCA(u,u+1)]-=2; } dfs(); cout<<res; } int main(){ setup(); init(); sol(); }

Compilation message (stderr)

putovanje.cpp: In function 'void setup()':
putovanje.cpp:16:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |                 freopen(FNAME".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
putovanje.cpp:17:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |                 freopen(FNAME".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...