Submission #386409

#TimeUsernameProblemLanguageResultExecution timeMemory
386409kshitij_sodaniIslands (IOI08_islands)C++14
70 / 100
382 ms131076 KiB
//#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second #define endl '\n' llo n; vector<pair<int,llo>> adj[1000001]; vector<pair<int,llo>> adj2[1000001]; int par[1000001]; int find(int no){ if(par[no]==no){ return no; } par[no]=find(par[no]); return par[no]; } llo dp[1000001][2]; pair<llo,llo> cur; vector<pair<int,llo>> pp; vector<pair<int,llo>> xx; bool vis[1000001]; vector<llo> tt; void dfs(llo no,llo par2=-1){ if(no==cur.b){ pp=xx; } tt.pb(no); for(auto j:adj[no]){ /*if(j.a==cur.a and no==cur.b){ continue; } if(j.a==cur.b and no==cur.a){ continue; }*/ if(j.a!=par2){ xx.pb({j.a,j.b}); dfs(j.a,no); xx.pop_back(); } } } llo maa=0; void dfs2(llo no,llo par2=-1){ dp[no][0]=0; dp[no][1]=0; vector<llo> ss; llo su=0; for(auto j:adj[no]){ if(vis[j.a]){ continue; } if(j.a!=par2){ dfs2(j.a,no); // dp[no][0]=max(dp[no][0],j.b+dp[j.a][0]); su+=dp[j.a][1]; ss.pb(dp[j.a][0]+j.b); } } sort(ss.begin(),ss.end()); reverse(ss.begin(),ss.end()); dp[no][1]=0; dp[no][0]=0; for(llo i=0;i<ss.size();i++){ if(i==2){ break; } if(i==0){ if(ss[i]>=0){ dp[no][0]+=ss[i]; } } if(ss[i]>=0){ dp[no][1]+=ss[i]; } } dp[no][1]=max(dp[no][1],dp[no][0]); maa=max(maa,dp[no][1]); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n; for(llo i=0;i<n;i++){ par[i]=i; } vector<pair<pair<int,int>,llo>> ed; for(llo i=0;i<n;i++){ llo aa,cc; cin>>aa>>cc; aa--; llo x=find(i); llo y=find(aa); if(x!=y){ par[x]=y; adj[i].pb({aa,cc}); adj[aa].pb({i,cc}); } else{ ed.pb({{i,aa},cc}); //cout<<i<<":"<<aa<<":"<<cc<<endl; } } llo ans=0; for(auto j:ed){ cur=j.a; llo cost=0; tt.clear(); dfs(j.a.a); pp.pb({cur.a,j.b}); for(auto i:pp){ vis[i.a]=1; } vector<pair<pair<int,int>,llo>> pc; pc.pb(j); for(auto i:tt){ for(auto k:adj[i]){ if(vis[k.a]+vis[i]<2){ //adj2[i].pb(k); } else{ if(k.a<i){ pc.pb({{i,k.a},k.b}); } } } } /* for(auto i:pc){ cout<<i.a.a<<","<<i.a.b<<","<<i.b<<endl; }*/ if(pp.size()==2){ llo zz5=0; for(auto i:tt){ for(auto k:adj[i]){ //cout<<i<<":"<<k.a<<":"<<k.b<<endl; if(vis[k.a]+vis[i]<2){ adj2[i].pb(k); } else{ //if(k.a<i){ zz5=max(zz5,k.b); //} } } } maa=0; for(auto i:pp){ dfs2(i.a); } zz5=max(zz5,j.b); cost=max(cost,maa); //cost=max(cost,dp[pp[0].a][1]+dp[pp[1].a][1]); cost=max(cost,dp[pp[0].a][0]+dp[pp[1].a][0]+zz5); ans+=cost; /* while(true){ continue; }*/ //cout<<cost<<":"<<endl; continue; } maa=0; for(auto i:tt){ for(auto k:adj[i]){ if(vis[k.a]+vis[i]<2){ adj2[i].pb(k); } else{ } } } for(auto i:pp){ dfs2(i.a); } cost=max(cost,maa); // vector<pair<int,llo>> pp2=pp; llo xx=pp.size(); multiset<llo> zz; for(int i=0;i<xx;i++){ pp.pb(pp[i]); } vector<llo> xd; llo su2=0; /*for(auto i:pp2){ cout<<i.a<<"<"<<i.b<<endl; }*/ for(llo i=0;i<pp.size();i++){ if(i>=xx){ auto jj=zz.find(xd[i-xx]); zz.erase(jj); } su2+=pp[i].b; if(zz.size()){ auto jj=zz.end(); jj--; cost=max(cost,dp[pp[i].a][0]+su2+(*jj)); } xd.pb(dp[pp[i].a][0]-su2); zz.insert(xd.back()); } ans+=cost; } cout<<ans<<endl; return 0; }

Compilation message (stderr)

islands.cpp: In function 'void dfs2(llo, llo)':
islands.cpp:77:15: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |  for(llo i=0;i<ss.size();i++){
      |              ~^~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:206:16: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  206 |   for(llo i=0;i<pp.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...