# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
881437 | 2023-12-01T08:51:19 Z | andrei_boaca | 통행료 (IOI18_highway) | C++17 | 78 ms | 12188 KB |
#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() { for(int i=0;i<m;i++) { if(inarb[i]==0) { w[i]=0; continue; } int a=g[i].first,b=g[i].second; if(inx[a]||inx[b]) 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(i); inx[i]=1; } else y.push_back(i); } ll val=buildx(); 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; if(d[2][i]<d[1][i]) where[i]=2; } int S=plsfind(1); int T=plsfind(2); answer(S,T); }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 6616 KB | Output is correct |
2 | Correct | 1 ms | 6612 KB | Output is correct |
3 | Incorrect | 1 ms | 6616 KB | Output is incorrect: {s, t} is wrong. |
4 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 2 ms | 6672 KB | Output is correct |
2 | Incorrect | 9 ms | 7288 KB | Output is incorrect: {s, t} is wrong. |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 8 ms | 7288 KB | Output is correct |
2 | Correct | 19 ms | 8288 KB | Output is correct |
3 | Correct | 23 ms | 8640 KB | Output is correct |
4 | Correct | 66 ms | 12108 KB | Output is correct |
5 | Correct | 64 ms | 11956 KB | Output is correct |
6 | Correct | 78 ms | 11948 KB | Output is correct |
7 | Correct | 73 ms | 12072 KB | Output is correct |
8 | Correct | 65 ms | 12188 KB | Output is correct |
9 | Correct | 68 ms | 12164 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 2 ms | 6676 KB | Output is incorrect: {s, t} is wrong. |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 12 ms | 7336 KB | Output is incorrect: {s, t} is wrong. |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 11 ms | 7332 KB | Output is incorrect: {s, t} is wrong. |
2 | Halted | 0 ms | 0 KB | - |