Submission #864466

#TimeUsernameProblemLanguageResultExecution timeMemory
864466HuyQuang_re_ZeroIslands (IOI08_islands)C++14
80 / 100
593 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; struct edge { int u,num,k; }; vector <edge> a[N]; int tr[N],trc[N],incycle[N],cycle[N],visited[N]; ll n,i,u,v,k,c[N],dis[N],ncycle,sum,res; const ll oo=round(1e18); struct Fenwick_Tree { ll bit[N],d[N],n; void Init(int _n) { n=_n; for(int i=1;i<=n;i++) bit[i]=d[i]=-oo; } void update(int i,ll k) { d[i]=max(d[i],k); while(i<=n) bit[i]=max(bit[i],k),i+=(i & -i); } ll get(int l,int r) { ll res=-oo,i=r; while(i>=l) if(i-(i & -i)>=l) res=max(res,bit[i]),i-=(i & -i); else res=max(res,d[i]),i--; return res; } } FT; void dfs(int u) { visited[u]=1; for(edge adj:a[u]) { int v=adj.u; if(visited[v]==0) dfs(v); } } void Find_cycle(int u,int x) { for(edge adj:a[u]) { if(adj.num==x) continue; int v=adj.u,k=adj.k; if(tr[v]==0) { tr[v]=u; trc[v]=k; Find_cycle(v,adj.num); } 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 ; } } } ///////////////////////////////////////////////////////////////////////////// ll cal(int u,int p,ll &ma) { ll res=0,ma0=0,ma1=0; for(edge adj:a[u]) { int v=adj.u; if(v!=p && incycle[v]==0) { ll k=cal(v,u,ma)+adj.k; res=max(res,k); if(ma0<k) ma0=k; if(ma1<ma0) swap(ma1,ma0); } } ma=max(ma,ma0+ma1); return res; } ll Work() { int i,u,v; FT.Init(ncycle); ll res=0; for(i=1;i<=ncycle;i++) { u=cycle[i]; c[i]=cal(u,0,res); FT.update(i,c[i]-dis[i]); } for(i=1;i<ncycle;i++) { int l=i,r=ncycle; while(l<r) { int mid=(l+r+1)>>1; if(sum-(dis[mid]-dis[i])>=dis[mid]-dis[i]) l=mid; else r=mid-1; } res=max(res,c[i]+sum+dis[i]+FT.get(i+1,l)); } FT.Init(ncycle); for(i=1;i<=ncycle;i++) { u=cycle[i]; FT.update(i,c[i]+dis[i]); } for(i=1;i<ncycle;i++) { int l=i,r=ncycle; while(l<r) { int mid=(l+r+1)>>1; if(sum-(dis[mid]-dis[i])>=dis[mid]-dis[i]) l=mid; else r=mid-1; } res=max(res,c[i]-dis[i]+FT.get(l+1,ncycle)); } 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; a[u].push_back({ v,u,k }); a[v].push_back({ u,u,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 function 'long long int Work()':
islands.cpp:103:13: warning: unused variable 'v' [-Wunused-variable]
  103 |     int i,u,v;
      |             ^
islands.cpp: In function 'int main()':
islands.cpp:155:26: warning: narrowing conversion of 'v' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,k });
      |                          ^
islands.cpp:155:28: warning: narrowing conversion of 'u' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,k });
      |                            ^
islands.cpp:155:30: warning: narrowing conversion of 'k' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,k });
      |                              ^
islands.cpp:155:53: warning: narrowing conversion of 'u' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,k });
      |                                                     ^
islands.cpp:155:55: warning: narrowing conversion of 'u' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,k });
      |                                                       ^
islands.cpp:155:57: warning: narrowing conversion of 'k' from 'long long int' to 'int' [-Wnarrowing]
  155 |         a[u].push_back({ v,u,k }); a[v].push_back({ u,u,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...