Submission #223194

#TimeUsernameProblemLanguageResultExecution timeMemory
223194tqbfjotldPutovanje (COCI20_putovanje)C++14
110 / 110
152 ms19448 KiB
#include <bits/stdc++.h> using namespace std; #define MAX_N 200005 vector<pair<int,int> >adjl[200005]; int p[200005]; int h[200005]; int head[200005]; int pos[200005]; long long fenwick[MAX_N]; int cur = 0; long long o1[200005]; long long o2[200005]; int val[200005]; int heavy[200005]; void update(int po, long long val){ //printf("upd %d with %d\n",po,val); while (po<MAX_N){ fenwick[po] += val; po += (po&(-po)); } } long long query(int a){ long long ans = 0; while (a>0){ ans += fenwick[a]; a -= (a&(-a)); } return ans; //I NEED TO STOP FORGETTING THIS } long long query(int a, int b){ return query(b)-query(a-1); } int dfs(int node, int parent, int height){ h[node] = height; p[node] = parent; int cursize = 1; int maxsize = -1; for (auto x : adjl[node]){ if (x.first==parent) { val[node] = x.second; continue; } int t = dfs(x.first,node,height+1); if (t>maxsize){ heavy[node] = x.first; maxsize = t; } cursize+=t; } return cursize; } void decomp(int node, int he){ head[node] = he; pos[node] = cur; cur++; if (heavy[node]!=-1) decomp(heavy[node],he); for (auto x : adjl[node]){ if (x.first == p[node]) continue; if (x.first == heavy[node]) continue; decomp(x.first,x.first); } } int main(){ int n; scanf("%d",&n); for (int x = 0; x<n-1; x++){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); adjl[a].push_back({b,x}); adjl[b].push_back({a,x}); o1[x] = d; o2[x] = c; } memset(heavy,-1,sizeof(heavy)); dfs(1,-1,0); decomp(1,1); for (int x = 2; x<=n; x++){ int a = x-1; int b = x; while (head[a]!=head[b]){ if (h[head[a]]<h[head[b]]) { int t = a; a = b; b = t; } update(pos[head[a]],1); update(pos[a]+1,-1); a = p[head[a]]; } if (a!=b){ update(min(pos[a],pos[b])+1,1); update(max(pos[a],pos[b])+1,-1); } } long long ans = 0; for (int x = 2; x<=n; x++){ long long option1 = o1[val[x]]; long long option2 = o2[val[x]]*query(pos[x]); ans += min(option1,option2); } printf("%lld",ans); }

Compilation message (stderr)

putovanje.cpp: In function 'int main()':
putovanje.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&n);
     ~~~~~^~~~~~~~~
putovanje.cpp:78:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d%d",&a,&b,&c,&d);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...