Submission #118782

#TimeUsernameProblemLanguageResultExecution timeMemory
118782someone_aaHighway Tolls (IOI18_highway)C++17
100 / 100
421 ms23344 KiB
#include "highway.h" #include <bits/stdc++.h> #define ll long long #define pb push_back #define mp make_pair using namespace std; const int maxn = 150100; int n, m; vector<int>w; vector<int>gs[maxn]; vector<pair<int,int> > g[maxn]; vector<int>gt[maxn]; int dist[maxn][2], parent[maxn][2]; int pind[maxn], x; bool visited[maxn]; ll dista; int type[maxn]; bool important[maxn]; vector<pair<int,int> > st[2]; void bfs(int u, int v) { visited[u] = visited[v] = true; queue<pair<int,int> > q; type[u] = 0; type[v] = 1; q.push(mp(u, 0)); q.push(mp(v, 1)); pind[u] = pind[v] = -1; st[0].pb(mp(u, x)); st[1].pb(mp(v, x)); while(!q.empty()) { int curr = q.front().first; int currtype = q.front().second; q.pop(); for(auto i:g[curr]) { int ni = i.first, nind = i.second; if(visited[ni]) continue; visited[ni] = true; pind[ni] = nind; important[nind] = true; q.push(mp(ni, currtype)); st[currtype].pb(mp(ni, nind)); } } } int solve(int root, int d) { int li = 0; int ri = st[d].size() - 1; int answ = li; //cout<<d<<": \n"; while(li <= ri) { int mid = (li + ri) / 2; vector<int>w(m, 0); for(int i=mid;i<st[d].size();i++) { w[st[d][i].second] = 1; } for(int i=0;i<m;i++) { if(!important[i]) w[i] = 1; } ll currdist = ask(w); //cout<<mid<<": "<<currdist<<"\n"; if(currdist == dista) { ri = mid - 1; } else { li = mid + 1; answ = max(answ, mid); } } return st[d][answ].first; } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n = N; m = U.size(); int li=0, ri=m-1; for(int i=0;i<m;i++) { //ind[mp(U[i], V[i])] = ind[mp(V[i], U[i])] = i; gs[U[i]].pb(V[i]); gs[V[i]].pb(U[i]); g[U[i]].pb(mp(V[i], i)); g[V[i]].pb(mp(U[i], i)); w.pb(0); } dista = ask(w); while(li <= ri) { int mid = (li + ri) / 2; for(int i=0;i<=mid;i++) { w[i] = 1; } ll currdist = ask(w); //cout<<li<<", "<<ri<<" - "<<mid<<": "<<currdist<<"\n"; for(int i=0;i<=mid;i++) { w[i] = 0; } if(currdist == dista) { li = mid + 1; } else { ri = mid - 1; x = mid; } } int u = U[x], v = V[x]; important[x] = true; //cout<<u<<" "<<v<<"\n"; bfs(u, v); //preprocess(); //memset(visited,false,sizeof(visited)); //cout<<"Ans: "<<xx<<" "<<yy<<"\n"; answer(solve(u, 0), solve(v, 1)); }

Compilation message (stderr)

highway.cpp: In function 'int solve(int, int)':
highway.cpp:70:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=mid;i<st[d].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...