제출 #386380

#제출 시각아이디문제언어결과실행 시간메모리
386380kshitij_sodaniIslands (IOI08_islands)C++14
0 / 100
2096 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<llo,llo>> adj[1000001]; vector<pair<llo,llo>> adj2[1000001]; llo par[1000001]; llo find(llo 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<llo,llo>> pp; vector<pair<llo,llo>> xx; 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 vis[1000001]; void dfs2(llo no,llo par2=-1){ dp[no][0]=0; dp[no][1]=0; vector<llo> ss; llo su=0; for(auto j:adj2[no]){ 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-dp[j.a][1]); } } sort(ss.begin(),ss.end()); reverse(ss.begin(),ss.end()); dp[no][1]=su; dp[no][0]=su; 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]); } 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<llo,llo>,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<llo,llo>,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); //} } } } for(auto i:pp){ dfs2(i.a); } zz5=max(zz5,j.b); 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; } for(auto ii:pc){ for(auto i:tt){ adj2[i].clear(); } for(auto i:tt){ for(auto k:adj[i]){ if(vis[k.a]+vis[i]<2){ adj2[i].pb(k); } else{ if(k.a==ii.a.a and i==ii.a.b){ continue; } if(k.a==ii.a.b and i==ii.a.a ){ continue; } adj2[i].pb(k); // pc.pb({{i,k.a},k.b}); } } } dfs2(tt[0]); cost=max(cost,dp[tt[0]][1]); //cout<<ii.a.a<<"<"<<ii.a.b<<","<<ii.b<<endl; //cout<<dp[tt[0]][1]<<endl; } ans+=cost; continue; /*for(auto i:tt){ cout<<i<<","; } cout<<endl;*/ llo kk=0; vector<llo> re; for(auto i:pp){ dfs2(i.a); kk+=dp[i.a][1]; llo ac=0; for(auto j:adj2[i.a]){ ac+=dp[j.a][1]; } re.pb(ac); //cout<<i.a<<":"<<1<<endl; } /* for(auto j:pp){ cout<<j.a<<":"<<j.b<<endl; cout<<dp[j.a][0]<<"."<<dp[j.a][1]<<endl; }*/ cost=max(cost,kk); llo xx=pp.size(); for(llo i=0;i<pp.size();i++){ llo ind=i; llo su=0; for(llo cot=0;cot<xx-1;cot++){ ind++; if(ind==xx){ ind=0; } //cout<<i<<".."<<ind<<endl; su+=pp[ind].b; llo cur2=su; cur2+=dp[pp[i].a][0]-dp[pp[i].a][1]; cur2+=dp[pp[ind].a][0]-dp[pp[ind].a][1]; cost=max(cost,cur2+kk); su-=(dp[pp[ind].a][1]); su+=re[ind]; } } for(auto i:pp){ vis[i.a]=0; } ans+=cost; } cout<<ans<<endl; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

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