제출 #233048

#제출 시각아이디문제언어결과실행 시간메모리
233048FieryPhoenixIslands (IOI08_islands)C++11
컴파일 에러
0 ms0 KiB
#pragma comment(linker, "/STACK: 2000000") //#pragma GCC target ("avx2") //#pragma GCC optimization ("O3") //#pragma GCC optimization ("unroll-loops") #include <bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; typedef long double ld; #define INF 2001001001 #define MOD 1000000007 #define f first #define s second int N; bool vis[1000001]; ll ans; int C; int cycle[1000001],adjDis[1000001]; ll deepest[1000001]; int bad,bad2; ll maxCur; map<pair<int,int>,int>mp; ll pref[1000001],suff[1000001]; pair<pair<int,int>,int> edges[2000005]; int L[1000001],R[1000001]; void findCycle(int node, int par){ //cout<<"findCycle: "<<node<<endl; vis[node]=true; for (int i=L[node];i<=R[node];i++){ pair<int,int> p={edges[i].f.s,edges[i].s}; if (C==0 && vis[p.first] && p.first!=par){ //found cycle C=0; //cout<<"found cycle"<<endl; int cur=node; while (cur!=p.first){ cycle[C]=cur; adjDis[C]=deepest[cur]; //fromDis C++; cur=pref[cur]; //from } cycle[C]=p.first; adjDis[C]=p.second; C++; } else if (!vis[p.first]){ pref[p.first]=node; //from deepest[p.first]=p.second; //fromDis findCycle(p.first,node); } } } ll maxDis,maxNode; queue<pair<pair<int,int>,ll>>q; void findFarthest(int node0, int par0, ll dis0){ maxDis=-1; maxNode=-1; q.push({{node0,par0},dis0}); while (!q.empty()){ pair<pair<int,int>,ll>P=q.front(); q.pop(); int node=P.f.f; int par=P.f.s; ll dis=P.s; if (dis>maxDis){ maxDis=dis; maxNode=node; } for (int i=L[node];i<=R[node];i++){ pair<int,int> p={edges[i].f.s,edges[i].s}; if (p.first!=par && p.first!=bad && p.first!=bad2) q.push({{p.first,node},dis+p.second}); } } } ll findDiameter(int node){ findFarthest(node,node,0); int newNode=maxNode; findFarthest(newNode,newNode,0); return maxDis; } int main() { scanf("%d",&N); for (int i=1;i<=N;i++){ L[i]=INF; R[i]=-INF; int Y,L; scanf("%d%d",&Y,&L); int x=i,y=Y; if (x>y) swap(x,y); mp[{x,y}]=max(mp[{x,y}],L); } int E=0; for (auto it:mp){ //cout<<"edge: "<<it.first.first<<' '<<it.first.second<<endl; edges[E++]={{it.f.f,it.f.s},it.s}; edges[E++]={{it.f.s,it.f.f},it.s}; } mp.clear(); sort(edges,edges+E); for (int i=0;i<E;i++){ L[edges[i].f.f]=min(L[edges[i].f.f],i); R[edges[i].f.f]=max(R[edges[i].f.f],i); } for (int i=1;i<=N;i++) if (!vis[i]){ //cout<<"Component: "<<i<<endl; C=0; findCycle(i,i); /* cout<<"Cycle: "; for (int i=0;i<C;i++) cout<<cycle[i]<<' '<<adjDis[i]<<endl;; cout<<endl; */ if (C==0){ //cout<<"multiEdge: "<<findDiameter(i)<<endl; ans+=findDiameter(i); continue; } maxCur=0; for (int i=0;i<C;i++){ pref[i]=0; suff[i]=0; int inFront=cycle[(i+1)%C]; int inBack=cycle[(i-1+C)%C]; //adjDis[i]=mp[{min(cycle[i],inFront),max(cycle[i],inFront)}]; bad=inFront; bad2=inBack; maxCur=max(maxCur,findDiameter(cycle[i])); findFarthest(cycle[i],cycle[i],0); deepest[i]=maxDis; } ll temp=0,temp2=0; for (int i=0;i<C;i++){ if (i>0){ pref[i]=temp+adjDis[i-1]; temp=pref[i]; pref[i]=max(temp2,pref[i]+deepest[i]); temp2=pref[i]; } else{ pref[i]=deepest[i]; temp2=pref[i]; } } /* cout<<"deepest: "<<' '; for (int x:deepest) cout<<x<<' '; cout<<endl; cout<<"adjDis: "<<' '; for (int x:adjDis) cout<<x<<' '; cout<<endl; cout<<"pref: "; for (int i=0;i<C;i++) cout<<pref[i]<<' '; cout<<endl; */ temp=0; temp2=0; for (int i=C-1;i>=0;i--){ if (i+1<C){ suff[i]=temp+adjDis[i]; temp=suff[i]; suff[i]=max(temp2,suff[i]+deepest[i]); temp2=suff[i]; } else{ suff[i]=deepest[i]; temp2=suff[i]; } } for (int i=0;i+1<C;i++){ //cout<<i<<": "<<adjDis.back()<<' '<<pref2[i]<<' '<<suff2[i+1]<<endl; maxCur=max(maxCur,adjDis[C-1]+pref[i]+suff[i+1]); } ll sweep=0; for (int i=0;i<C;i++){ maxCur=max(maxCur,sweep+deepest[i]); sweep=max(sweep,(ll)deepest[i]); sweep+=adjDis[i]; } for (int i=0;i<C;i++) vector<pair<int,int>>().swap(adj[cycle[i]]); ans+=maxCur; //cout<<"maxCur: "<<maxCur<<endl; } printf("%lld\n",ans); }

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

islands.cpp:1:0: warning: ignoring #pragma comment  [-Wunknown-pragmas]
 #pragma comment(linker, "/STACK: 2000000")
 
islands.cpp: In function 'int main()':
islands.cpp:193:38: error: 'adj' was not declared in this scope
         vector<pair<int,int>>().swap(adj[cycle[i]]);
                                      ^~~
islands.cpp:193:38: note: suggested alternative: 'bad2'
         vector<pair<int,int>>().swap(adj[cycle[i]]);
                                      ^~~
                                      bad2
islands.cpp:92:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&N);
   ~~~~~^~~~~~~~~
islands.cpp:96:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&Y,&L);
     ~~~~~^~~~~~~~~~~~~~