Submission #864498

#TimeUsernameProblemLanguageResultExecution timeMemory
864498HuyQuang_re_ZeroIslands (IOI08_islands)C++14
90 / 100
795 ms131072 KiB
#include <bits/stdc++.h> #define ll long long #define db long double #define N 1000005 #define II pair <int,int> #define III pair <ll,II> #define IV pair <vector <int>,vector <int> > #define fst first #define snd second #define BIT(x,i) ((x>>i)&1) #define Log(x) (31-__builtin_clz((int)x)) #define LogLL(x) (63-__builtin_clzll((ll)x)) #define pi acos(-1) #define to_radian(x) (x*pi/180.0) #define to_degree(x) (x*180.0/pi) using namespace std; vector <int> a[N]; int tr[N],trc[N],cycle[N],nxt[N],w[N]; bool incycle[N],visited[N]; ll n,i,u,v,k,c[N],dis[N],ncycle,sum,res; const ll oo=round(1e18); void dfs(int u) { visited[u]=1; auto consider=[&](int v) { if(visited[v]==0) dfs(v); }; for(int adj:a[u]) consider(adj); consider(nxt[u]); } void Find_cycle(int u,int x) { auto consider=[&](int v,int From) { if(From==x) return; // if(adj==x) cerr<<adj<<'\n'; int k=w[From]; // if(u==23) cerr<<v<<" "<<From<<" "<<tr[v'\n'; if(tr[v]==0) { tr[v]=u; trc[v]=k; Find_cycle(v,From); } else if(ncycle==0) { sum=0; // cerr<<u<<' '<<v<<" "<<From<<" "<<x<<'\n'; while(u!=v) { // if(u>0) cerr<<u<<" "<<tr[23]<<'\n'; cycle[++ncycle]=u; incycle[u]=1; dis[ncycle]=sum; sum+=trc[u]; u=tr[u]; } cycle[++ncycle]=u; incycle[u]=1; dis[ncycle]=sum; sum+=k; return ; } }; for(int adj:a[u]) { consider(adj,adj); if(ncycle>0) return ; } consider(nxt[u],u); } ///////////////////////////////////////////////////////////////////////////// ll cal(int u,int p,ll &ma) { ll res=0,ma0=0,ma1=0; auto consider=[&](int adj,int From) { int v=adj; if(v!=p && incycle[v]==0) { ll k=cal(v,u,ma)+w[From]; res=max(res,k); if(ma0<k) ma0=k; if(ma1<ma0) swap(ma1,ma0); } }; for(int adj:a[u]) consider(adj,adj); consider(nxt[u],u); ma=max(ma,ma0+ma1); return res; } ll Work() { int i,u,v; ll res=0,ma=-oo; for(i=1;i<=ncycle;i++) { u=cycle[i]; c[i]=cal(u,0,res); } deque <int> dq; int j=1; for(i=1;i<ncycle;i++) { while(j<ncycle && sum-dis[j+1]+dis[i]>=dis[j+1]-dis[i]) { j++; while(dq.size()>0 && c[dq.back()]-dis[dq.back()]<c[j]-dis[j]) dq.pop_back(); dq.push_back(j); } if(dq.size()>0 && dq.front()==i) dq.pop_front(); if(dq.size()>0) res=max(res,c[i]+c[dq.front()]+sum+dis[i]-dis[dq.front()]); } j=ncycle+1; for(i=ncycle-1;i>=1;i--) { while(j-1>i && sum-dis[j-1]+dis[i]<dis[j-1]-dis[i]) { j--; ma=max(ma,c[j]+dis[j]); } res=max(res,c[i]-dis[i]+ma); } return res; } int main() { // freopen("islands.inp","r",stdin); // freopen("islands.out","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(u=1;u<=n;u++) { cin>>v>>k; nxt[u]=v; a[v].push_back(u); w[u]=k; } for(u=1;u<=n;u++) if(visited[u]==0) { // cerr<<u<<'\n'; dfs(u); // cerr<<u<<'\n'; tr[u]=-1; ncycle=0; Find_cycle(u,0); // cerr<<u<<'\n'; res+=Work(); } cout<<res; }

Compilation message (stderr)

islands.cpp: In function 'long long int Work()':
islands.cpp:94:13: warning: unused variable 'v' [-Wunused-variable]
   94 |     int i,u,v;
      |             ^
#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...