제출 #92263

#제출 시각아이디문제언어결과실행 시간메모리
92263Retro3014Islands (IOI08_islands)C++17
80 / 100
932 ms132096 KiB
#include <iostream> #include <algorithm> #include <vector> #include <deque> using namespace std; #define MAX_N 1000000 typedef long long ll; int N; struct S{ int idx; ll data; }; vector<S> gp[MAX_N+1]; int a, b; struct C{ ll a, b; }; S from[MAX_N+1]; vector<S> c; vector<C> cycle; bool vst[MAX_N+1]; bool isc[MAX_N+1]; int num[MAX_N+1]; ll len[MAX_N+1]; deque<int> leaf; ll m[MAX_N+1][3]; ll ans=0; vector<S> gp2; int main(){ scanf("%d", &N); for(int i=1; i<=N; i++){ scanf("%d%d", &a, &b); gp[i].push_back((S){a, (ll)b}); num[i]++; gp[a].push_back((S){i, (ll)b}); num[a]++; } for(int i=1; i<=N; i++){ if(num[i]==1){ leaf.push_back(i); } } while(!leaf.empty()){ int now=leaf.front(); leaf.pop_front(); vst[now]=true; m[now][0]=max(m[now][0], m[now][1]+m[now][2]); for(int i=0; i<gp[now].size(); i++){ if(!vst[gp[now][i].idx]){ len[gp[now][i].idx]=max(len[gp[now][i].idx], len[now]+gp[now][i].data); m[gp[now][i].idx][0]=max(m[gp[now][i].idx][0], m[now][0]); if(len[now]+gp[now][i].data>m[gp[now][i].idx][1]){ m[gp[now][i].idx][2]=m[gp[now][i].idx][1]; m[gp[now][i].idx][1]=len[now]+gp[now][i].data; }else if(len[now]+gp[now][i].data>m[gp[now][i].idx][2]){ m[gp[now][i].idx][2]=len[now]+gp[now][i].data; } num[gp[now][i].idx]--; if(num[gp[now][i].idx]==1){ leaf.push_back(gp[now][i].idx); } } } } ll ans2=0; ll sum=0, m1, m2; int t; for(int i=1; i<=N; i++){ if(!vst[i]){ for(int j=0; j<gp[i].size(); j++){ if(!vst[gp[i][j].idx]){ gp2.push_back(gp[i][j]); } } while(!gp[i].empty()) gp[i].pop_back(); while(!gp2.empty()){ gp[i].push_back(gp2.back()); gp2.pop_back(); } } } for(int i=1; i<=N; i++){ t=i; if(!vst[i]){ c.push_back({gp[i][1].idx, gp[i][1].data}); while(!c.empty()){ vst[t]=true; if(vst[gp[t][0].idx]){ if(vst[gp[t][1].idx]){ break; } c.push_back({t, gp[t][1].data}); t=gp[t][1].idx; }else{ c.push_back({t, gp[t][0].data}); t=gp[t][0].idx; } } ans2=0; sum=0; while(!c.empty()){ S now = c.back(); c.pop_back(); ans2=max(ans2, max(m[now.idx][0], m[now.idx][1]+m[now.idx][2])); sum+=now.data; cycle.push_back({now.data, len[now.idx]}); } m1 = m2 = 0; while(!cycle.empty()){ C now = cycle.back(); cycle.pop_back(); ans2=max(ans2, max(now.b, max(m1+now.b, m2+now.b))); m1=max(m1+now.a, now.a+now.b); m2=max(m2-now.a, sum-now.a+now.b); } ans+=ans2; } } printf("%lld", ans); return 0; }

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

islands.cpp: In function 'int main()':
islands.cpp:50:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<gp[now].size(); i++){
                      ~^~~~~~~~~~~~~~~
islands.cpp:72:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j=0; j<gp[i].size(); j++){
                          ~^~~~~~~~~~~~~
islands.cpp:35:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
     ~~~~~^~~~~~~~~~
islands.cpp:37:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~
#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...