Submission #138174

#TimeUsernameProblemLanguageResultExecution timeMemory
138174thebesHighway Tolls (IOI18_highway)C++14
100 / 100
471 ms38856 KiB
#include <bits/stdc++.h> #include "highway.h" using namespace std; typedef long long ll; const int MN = 150005; ll m, st, lo, hi, mm, i, x, y, vis[MN], s, t, d[MN], u[MN]; vector<int> q; map<pair<ll,ll>,ll> id; vector<ll> adj[MN], tr[MN], ls; queue<ll> qq; void sett(ll l){ for(int i=0;i<q.size();i++) q[i]=(i<=l); } void dfs(ll n){ for(auto v : tr[n]){ ls.push_back(id[{v, n}]); d[v] = d[n]+1; dfs(v); } } void find_pair(int N, vector<int> U, vector<int> V, int A, int B){ A = B = 0; m = U.size(); for(i=0;i<m;i++) q.push_back(0); for(i=0;i<m;i++){ x = U[i], y = V[i]; id[{x,y}]=id[{y,x}]=i; adj[x].push_back(y); adj[y].push_back(x); } st = ask(q); lo = 0, hi = m; while(lo<hi){ ll m = lo+hi>>1; sett(m); bool heh = (ask(q)==st); if(heh) lo=m+1; else hi=m; } mm = lo-1; sett(mm); x = U[mm+1], y = V[mm+1]; qq.push(x); qq.push(y); vis[x]=vis[y]=1; while(qq.size()){ x = qq.front(); qq.pop(); for(auto v : adj[x]){ if(id[{x,v}]>mm&&!vis[v]){ vis[v] = 1; qq.push(v); tr[x].push_back(v); u[id[{x,v}]]=1; } } } u[mm+1]=1; x = U[mm+1], y = V[mm+1]; dfs(x); lo = 0; hi = ls.size(); while(lo<hi){ ll mmm = lo+hi>>1; for(i=0;i<m;i++) q[i]=!u[i]; for(i=mmm;i<ls.size();i++) q[ls[i]]=1; bool heh = (ask(q)==st); if(heh) hi=mmm; else lo=mmm+1; } if(lo==0){ s = U[mm+1]; } else{ x = U[ls[lo-1]], y = V[ls[lo-1]]; if(d[x]>d[y]) s = x; else s = y; } ls.clear(); x = U[mm+1], y = V[mm+1]; dfs(y); lo = 0; hi = ls.size(); while(lo<hi){ ll mmm = lo+hi>>1; for(i=0;i<m;i++) q[i]=!u[i]; for(i=mmm;i<ls.size();i++) q[ls[i]]=1; bool heh = (ask(q)==st); if(heh) hi=mmm; else lo=mmm+1; } if(lo==0){ t = V[mm+1]; } else{ x = U[ls[lo-1]], y = V[ls[lo-1]]; if(d[x]>d[y]) t = x; else t = y; } answer(s, t); }

Compilation message (stderr)

highway.cpp: In function 'void sett(ll)':
highway.cpp:12:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     for(int i=0;i<q.size();i++)
      |                 ~^~~~~~~~~
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:33:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |         ll m = lo+hi>>1;
      |                ~~^~~
highway.cpp:58:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |         ll mmm = lo+hi>>1;
      |                  ~~^~~
highway.cpp:60:20: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |         for(i=mmm;i<ls.size();i++) q[ls[i]]=1;
      |                   ~^~~~~~~~~~
highway.cpp:78:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   78 |         ll mmm = lo+hi>>1;
      |                  ~~^~~
highway.cpp:80:20: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |         for(i=mmm;i<ls.size();i++) q[ls[i]]=1;
      |                   ~^~~~~~~~~~
#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...