Submission #864493

#TimeUsernameProblemLanguageResultExecution timeMemory
864493HuyQuang_re_ZeroIslands (IOI08_islands)C++14
90 / 100
1139 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]; struct edge { int u,v,k; }; edge e[N]; int tr[N],trc[N],cycle[N],nxt[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 adj) { int v=(e[adj].u==u ? e[adj].v : e[adj].u); 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 adj) { if(adj==x) return; int v=v=(e[adj].u==u ? e[adj].v : e[adj].u),k=e[adj].k; if(tr[v]==0) { tr[v]=u; trc[v]=k; Find_cycle(v,adj); } else if(ncycle==0) { sum=0; while(u!=v) { 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); consider(nxt[u]); } ///////////////////////////////////////////////////////////////////////////// ll cal(int u,int p,ll &ma) { ll res=0,ma0=0,ma1=0; auto consider=[&](int adj) { int v=v=(e[adj].u==u ? e[adj].v : e[adj].u);; if(v!=p && incycle[v]==0) { ll k=cal(v,u,ma)+e[adj].k; res=max(res,k); if(ma0<k) ma0=k; if(ma1<ma0) swap(ma1,ma0); } }; for(int adj:a[u]) consider(adj); consider(nxt[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]=u; a[v].push_back(u); e[u]={ u,v,k }; } for(u=1;u<=n;u++) if(visited[u]==0) { dfs(u); tr[u]=-1; ncycle=0; Find_cycle(u,0); res+=Work(); } cout<<res; }

Compilation message (stderr)

islands.cpp: In lambda function:
islands.cpp:42:16: warning: operation on 'v' may be undefined [-Wsequence-point]
   42 |         int v=v=(e[adj].u==u ? e[adj].v : e[adj].u),k=e[adj].k;
      |               ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
islands.cpp: In lambda function:
islands.cpp:73:16: warning: operation on 'v' may be undefined [-Wsequence-point]
   73 |         int v=v=(e[adj].u==u ? e[adj].v : e[adj].u);;
      |               ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
islands.cpp: In function 'long long int Work()':
islands.cpp:89:13: warning: unused variable 'v' [-Wunused-variable]
   89 |     int i,u,v;
      |             ^
islands.cpp: In function 'int main()':
islands.cpp:134:16: warning: narrowing conversion of 'u' from 'long long int' to 'int' [-Wnarrowing]
  134 |         e[u]={ u,v,k };
      |                ^
islands.cpp:134:18: warning: narrowing conversion of 'v' from 'long long int' to 'int' [-Wnarrowing]
  134 |         e[u]={ u,v,k };
      |                  ^
islands.cpp:134:20: warning: narrowing conversion of 'k' from 'long long int' to 'int' [-Wnarrowing]
  134 |         e[u]={ u,v,k };
      |                    ^
#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...