제출 #881458

#제출 시각아이디문제언어결과실행 시간메모리
881458andrei_boaca통행료 (IOI18_highway)C++17
18 / 100
149 ms14260 KiB
#include "highway.h" #include <bits/stdc++.h> //#include "grader.cpp" using namespace std; typedef long long ll; typedef pair<int,int> pii; mt19937 rng(chrono::steady_clock().now().time_since_epoch().count()); int n,m,niv[100005],roots[5]; ll dist,AA,BB,d[3][100005]; int where[100005]; vector<pii> muchii[100005]; vector<pii> g; vector<int> w; ll memo[100005],calls; bool inarb[300005],inx[300005]; void bfs(int ind) { for(int i=0;i<n;i++) d[ind][i]=1e9; d[ind][roots[ind]]=0; queue<int> coada; coada.push(roots[ind]); while(!coada.empty()) { int nod=coada.front(); coada.pop(); for(auto i:muchii[nod]) if(d[ind][i.first]>d[ind][nod]+1) { d[ind][i.first]=d[ind][nod]+1; coada.push(i.first); } } } ll buildniv(ll nivmax,ll ind) { for(int i=0;i<m;i++) { if(inarb[i]==0) { w[i]=1; continue; } int a=g[i].first,b=g[i].second; if(max(d[ind][a],d[ind][b])<=nivmax) w[i]=0; else w[i]=1; } return ask(w); } ll buildx(int ind) { for(int i=0;i<m;i++) { if(inarb[i]==0) { w[i]=1; continue; } int a=g[i].first,b=g[i].second; if(d[ind][a]<d[ind][b]) swap(a,b); if(inx[a]) w[i]=0; else w[i]=1; } return ask(w); } int plsfind(int ind) { for(int i=0;i<m;i++) inarb[i]=0; for(int i=0;i<n;i++) d[ind][i]=1e9; ll nivmax=0; d[ind][roots[ind]]=0; queue<int> coada; coada.push(roots[ind]); while(!coada.empty()) { int nod=coada.front(); nivmax=max(nivmax,d[ind][nod]); coada.pop(); for(auto i:muchii[nod]) if(where[i.first]==ind&&d[ind][i.first]>d[ind][nod]+1) { d[ind][i.first]=d[ind][nod]+1; inarb[i.second]=1; coada.push(i.first); } } int myniv=0; int st=0; int dr=min(nivmax,dist); while(st<=dr) { int mij=(st+dr)/2; ll val=buildniv(mij,ind); if(val==(dist-mij)*BB+mij*AA) { myniv=mij; st=mij+1; } else dr=mij-1; } vector<int> cand; for(int i=0;i<n;i++) if(d[ind][i]==myniv&&where[i]==ind) cand.push_back(i); while(true) { if(cand.size()==1) return cand[0]; int lg=cand.size(); vector<int> x,y; for(int i=0;i<n;i++) inx[i]=0; for(int i=0;i<cand.size();i++) { if(i<lg/2) { x.push_back(cand[i]); inx[cand[i]]=1; } else y.push_back(cand[i]); } bool ok=0; if(ind==2) ok=1; ll val=buildx(ind); if(val<dist*BB) cand=x; else cand=y; } } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { AA=A; BB=B; n=N; m=U.size(); for(int i=0;i<m;i++) { int a=U[i],b=V[i]; g.push_back({a,b}); muchii[a].push_back({b,i}); muchii[b].push_back({a,i}); } w.resize(m); dist=ask(w)/A; ll st=0; ll dr=m-1; while(st<=dr) { ll mij=(st+dr)/2; for(int i=0;i<m;i++) { if(i<=mij) w[i]=1; else w[i]=0; } ll val=ask(w); if(val>dist*A) { roots[1]=g[mij].first; roots[2]=g[mij].second; dr=mij-1; } else st=mij+1; } bfs(1); bfs(2); for(int i=0;i<n;i++) { if(d[1][i]<d[2][i]) where[i]=1; else where[i]=2; } int S=plsfind(1); int T=plsfind(2); answer(S,T); }

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

highway.cpp: In function 'int plsfind(int)':
highway.cpp:121:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |         for(int i=0;i<cand.size();i++)
      |                     ~^~~~~~~~~~~~
highway.cpp:131:14: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  131 |         bool ok=0;
      |              ^~
#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...