Submission #386444

#TimeUsernameProblemLanguageResultExecution timeMemory
386444kshitij_sodaniIslands (IOI08_islands)C++14
80 / 100
822 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,int>> adj[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<int,int> cur; vector<pair<int,int>> pp; //vector<pair<int,int>> xx; //bool vis[1000001]; //vector<int> tt; int stt=0; void dfs(int no,int par2=-1){ if(no==cur.b){ //pp=xx; stt=1; } //tt.pb(no); for(auto j:adj[no]){ if(j.a!=par2){ if(stt==0){ pp.pb({j.a,j.b}); } dfs(j.a,no); if(stt==0){ pp.pop_back(); } } } } llo maa=0; void dfs2(int no,int par2=-1){ dp[no][0]=0; dp[no][1]=0; llo ma=0; llo ma2=0; for(auto j:adj[no]){ if(par[j.a]){ continue; } if(j.a!=par2){ dfs2(j.a,no); if(dp[j.a][0]+j.b>=ma){ ma2=ma; ma=dp[j.a][0]+j.b; } else if(dp[j.a][0]+j.b>=ma2){ ma2=dp[j.a][0]+j.b; } } } dp[no][1]=ma+ma2; dp[no][0]=ma; 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>,int>> ed; for(llo i=0;i<n;i++){ llo aa,cc; cin>>aa>>cc; aa--; int x=find(i); int 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}); } } for(int i=0;i<n;i++){ par[i]=0; } llo ans=0; multiset<llo> zz; for(auto j:ed){ cur=j.a; llo cost=0; pp.clear(); stt=0; dfs(j.a.a); pp.pb({cur.a,j.b}); for(auto i:pp){ par[i.a]=1; } maa=0; for(auto i:pp){ dfs2(i.a); } cost=max(cost,maa); int xx=pp.size(); for(int i=0;i<xx;i++){ pp.pb(pp[i]); } llo su2=0; llo su3=0; for(llo i=0;i<pp.size();i++){ if(i>=xx){ su3+=pp[i-xx].b; auto jj=zz.find(dp[pp[i-xx].a][0]-su3); 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)); } if(i<xx){ zz.insert(dp[pp[i].a][0]-su2); } } ans+=cost; } cout<<ans<<endl; return 0; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:132:16: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |   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...