Submission #356282

#TimeUsernameProblemLanguageResultExecution timeMemory
356282achibasadzishviliIslands (IOI08_islands)C++17
90 / 100
1265 ms131076 KiB
#include<bits/stdc++.h> #define ll long long #define f first #define s second #define pb push_back #define mp make_pair #define N 1000002 using namespace std; int n,l[N],k; bool fix[N],F[N],c[N]; long long len; long long mx[N],ans,pas; vector<pair<int,int> >v[N]; int g[N],dis[N],szg,szdis,d[N],cyc[N],szd,szc; void dfs(int x){ if(F[x])return; F[x] = 1; for(int i=0; i<v[x].size(); i++) dfs(v[x][i].f); } void findc(int x,int par){ if(fix[x]){ g[szg] = x; dis[szdis] = l[par]; szg++; szdis++; k = 1; return; } g[szg] = (x); szg++; fix[x] = 1; for(int i=0; i<v[x].size(); i++) if(v[x][i].s != par){ dis[szdis] = (l[v[x][i].s]);szdis++; findc(v[x][i].f , v[x][i].s); if(k)return; szdis--; } szg--; } void findmx(int x,int par){ for(int i=0; i<v[x].size(); i++){ if(v[x][i].s != par && !c[v[x][i].f]){ findmx(v[x][i].f , v[x][i].s); ans = max(ans , mx[x] + mx[v[x][i].f] + l[v[x][i].s]); mx[x] = max(mx[x] , mx[v[x][i].f] + l[v[x][i].s]); } } } int main(){ ios::sync_with_stdio(false); cin >> n; ll P; for(int i=1; i<=n; i++){ cin >> P >> l[i]; v[P].pb(mp(i , i)); v[i].pb(mp(P , i)); } ll cur,cur2,pre; for(int s=1; s<=n; s++){ if(F[s])continue; len = 0; ans = 0; k = 0; dfs(s); szg = 0; szdis = 0; findc(s , 0); szc = 0; szd = 0; for(int i=0; i<szg; i++){ if(g[i] == g[szg - 1]){ for(int j=i+1; j<szg; j++){ cyc[szc] = (g[j]);szc++; d[szd] = (dis[j - 1]);szd++; c[g[j]] = 1; } break; } } for(int i=0; i<szc; i++){ findmx(cyc[i] , 0); len += d[i]; } cur = mx[cyc[0]]; cur2 = mx[cyc[0]]; pre = 0; for(int i=1; i<szc; i++){ pre += d[i]; ans = max(ans , cur + mx[cyc[i]] + pre); ans = max(ans , cur2 + len + mx[cyc[i]] - pre); cur = max(cur , mx[cyc[i]] - pre); cur2 = max(cur2 , mx[cyc[i]] + pre); } pas += ans; } cout << pas << '\n'; return 0; }

Compilation message (stderr)

islands.cpp: In function 'void dfs(int)':
islands.cpp:18:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |     for(int i=0; i<v[x].size(); i++)
      |                  ~^~~~~~~~~~~~
islands.cpp: In function 'void findc(int, int)':
islands.cpp:33:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |     for(int i=0; i<v[x].size(); i++)
      |                  ~^~~~~~~~~~~~
islands.cpp: In function 'void findmx(int, int)':
islands.cpp:43:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     for(int i=0; i<v[x].size(); i++){
      |                  ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...