Submission #118167

#TimeUsernameProblemLanguageResultExecution timeMemory
118167baluteshihIslands (IOI08_islands)C++14
80 / 100
1209 ms131072 KiB
#include <bits/stdc++.h> #define jizz ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define pb push_back #define ET cout << "\n" #define MEM(i,j) memset(i,j,sizeof i) #define F first #define S second #define MP make_pair #define ALL(v) v.begin(),v.end() #define DB(a,s,e) {for(int i=s;i<e;++i) cout << a[i] << " ";ET;} using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; vector<int> G[1000005]; bitset<1000005> yc,vis; ll M,tp,sum[1000005]; pii edge[1000005]; pll cir[1000005]; int dq[1000005],dql,dqr; const ll INF=1e18; bool dfs(int u,int f) { int flag=0; vis[u]=1; for(int i:G[u]) if(i!=f) if(!vis[i]) if(dfs(i,i)) flag=1,cir[tp-1].S=edge[i].S; else; else if(!yc[u]) flag=1,yc[i]=1,cir[tp++]=MP(i,edge[i].S); if(u!=f) if(!vis[edge[u].F]) if(dfs(edge[u].F,u)) flag=1,cir[tp-1].S=edge[u].S; else; else if(!yc[u]) flag=1,yc[edge[u].F]=1,cir[tp++]=MP(edge[u].F,edge[u].S); if(flag) if(yc[u]) flag=0; else cir[tp++]=MP(u,0),yc[u]=1; return flag; } ll dfs2(int u) { ll mx=0,sx=0; yc[u]=1; for(int i:G[u]) if(!yc[i]) { ll d=dfs2(i)+edge[i].S; if(d>mx) sx=mx,mx=d; else if(d>sx) sx=d; } if(!yc[edge[u].F]) { ll d=dfs2(edge[u].F)+edge[u].S; if(d>mx) sx=mx,mx=d; else if(d>sx) sx=d; } M=max(M,sx+mx); vector<int>().swap(G[u]); return mx; } int main() { int n; ll ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d",&edge[i].F,&edge[i].S); if(edge[i].F!=i) G[edge[i].F].pb(i); } for(int i=1;i<=n;++i) if(!vis[i]) { tp=0,M=0,dql=0,dqr=-1,dfs(i,-1); for(int j=0;j<tp;++j) cir[j].F=dfs2(cir[j].F); if(tp>1) { sum[0]=0,dq[++dqr]=0; for(int j=1;j<2*tp;++j) { while(dqr>=dql&&j-dq[dql%tp]>=tp) ++dql; sum[j%tp]=sum[(j-1)%tp]+cir[(j-1)%tp].S,M=max(M,sum[j%tp]+cir[j%tp].F+cir[dq[dql%tp]%tp].F-sum[dq[dql%tp]%tp]); while(dqr>=dql&&cir[j%tp].F-sum[j%tp]>=cir[dq[dqr%tp]%tp].F-sum[dq[dqr%tp]%tp]) --dqr; while(dqr>=dql&&j+1-dq[dql%tp]>=tp) ++dql; dq[++dqr]=j; } } ans+=M; } printf("%lld\n",ans); }

Compilation message (stderr)

islands.cpp: In function 'bool dfs(int, int)':
islands.cpp:29:5: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
   if(i!=f)
     ^
islands.cpp:36:4: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
  if(u!=f)
    ^
islands.cpp:43:4: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
  if(flag)
    ^
islands.cpp: In function 'int main()':
islands.cpp:75:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
islands.cpp:78:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&edge[i].F,&edge[i].S);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...