제출 #386425

#제출 시각아이디문제언어결과실행 시간메모리
386425kshitij_sodaniIslands (IOI08_islands)C++14
80 / 100
729 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; void dfs(int no,int 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; llo ma=0; llo ma2=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]); 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; } //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]=ma+ma2; dp[no][0]=ma; /*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}); } } 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}); } } } } 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); 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(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)); } if(i<xx){ xd.pb(dp[pp[i].a][0]-su2); zz.insert(xd.back()); } } ans+=cost; } cout<<ans<<endl; return 0; }

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

islands.cpp: In function 'int main()':
islands.cpp:176: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]
  176 |   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...