제출 #1224993

#제출 시각아이디문제언어결과실행 시간메모리
1224993thelegendary08Highway Tolls (IOI18_highway)C++20
51 / 100
270 ms327680 KiB
#include "highway.h" #include<bits/stdc++.h> #define pb push_back #define mp make_pair #define vi vector<int> #define vvi vector<vector<int>> #define pii pair<int, int> #define vpii vector<pair<int, int>> #define vc vector<char> #define vb vector<bool> #define mii map<int,int> #define f0r(i,n) for(int i=0;i<n;i++) #define FOR(i,k,n) for(int i=k;i<n;i++) #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define in(a) int a; cin>>a #define in2(a,b) int a,b; cin>>a>>b #define in3(a,b,c) int a,b,c; cin>>a>>b>>c #define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d #define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];} #define out(a) cout<<a<<'\n' #define out2(a,b) cout<<a<<' '<<b<<'\n' #define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n' #define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n' #define pout(a) cout<<a.first<<' '<<a.second<<'\n' #define vout(v) for(auto u : v){cout<<u<<' ';} cout<<'\n' #define dout(a) cout<<a<<' '<<#a<<'\n' #define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<'\n' #define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';} const int leg = 1e9 + 7; const int mod = 998244353; using namespace std; const int mxn = 90005; vvi adj(mxn); vi dep(mxn); vi par(mxn); void dfs(int node, int from){ par[node] = from; for(auto u : adj[node]){ if(u != from){ dep[u] = dep[node] + 1; dfs(u, node); } } } int n; void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n = N; f0r(i, N){ adj[i].clear(); dep[i] = 0; par[i] = -1; } int M = U.size(); f0r(i, M){ adj[U[i]].pb(V[i]); adj[V[i]].pb(U[i]); } int rt = rand() % N; dfs(rt,-1); // dout(rt); int mx = 0; f0r(i, N){ mx = max(mx, dep[i]); } vvi deps(mx+1); vi edg(N, -1); vi cha(M); f0r(i, M){ deps[max(dep[U[i]], dep[V[i]])].pb(i); if(dep[U[i]] > dep[V[i]]){ cha[i] = U[i]; edg[U[i]] = i; } else{ cha[i] = V[i]; edg[V[i]] = i; } } vi quer(n-1); f0r(i, n-1)quer[i] = 0; long long r = ask(quer); long long length = r / A; int lo = 1; int hi = mx; while(lo < hi){ int mid = lo + (hi - lo + 1) / 2; vi quer(n-1); f0r(i, n){ if(dep[i] >= mid){ quer[edg[i]] = 1; } } long long r = ask(quer); if(r != length * A){ lo = mid; } else hi = mid - 1; } int ld = lo; //lowest depth in path, so must be at least depth of one of A and B // dout(ld); lo = 1; hi = ld; while(lo < hi){ int mid = lo + (hi - lo) / 2; vi quer(n-1); f0r(i,n){ if(i != rt && dep[i] <= mid){ quer[edg[i]] = 1; } } long long r = ask(quer); if(r != length * A){ hi = mid; } else lo = mid + 1; } int hd = lo - 1; // dout(hd); lo = 0; hi = deps[ld].size() - 1; while(lo < hi){ int mid = lo + (hi - lo) / 2; vi quer(n-1); f0r(i, deps[ld].size()){ if(i <= mid){ quer[deps[ld][i]] = 1; } } long long r = ask(quer); if(r != length * A){ hi = mid; } else{ lo = mid + 1; } } // dout(lo); // vout(deps[ld]); int fi = cha[deps[ld][lo]]; // dout(fi); int span = ld - hd; if(span == length){ int se = fi; f0r(i, length){ se = par[se]; } answer(fi, se); } else{ int od = length - span + hd; if(od == ld){ lo++; hi = deps[ld].size() - 1; int slo = lo; // cout<<lo<<' '<<hi<<endl; while(lo < hi){ int mid = lo + (hi - lo) / 2; vi quer(n-1); FOR(i, slo, deps[ld].size()){ if(i <= mid){ quer[deps[ld][i]] = 1; } } long long r = ask(quer); if(r != length * A){ hi = mid; } else{ lo = mid + 1; } } int se = cha[deps[ld][lo]]; answer(fi, se); } else{ vi bababa(n); int cur = fi; while(cur != rt){ bababa[cur] = 1; cur = par[cur]; } lo = 0; hi = deps[od].size() - 1; while(lo < hi){ int mid = lo + (hi - lo) / 2; vi quer(n-1); f0r(i, deps[od].size()){ if(i <= mid && bababa[cha[deps[od][i]]] == 0){ quer[deps[od][i]] = 1; } } long long r = ask(quer); if(r != length * A){ hi = mid; } else{ lo = mid + 1; } } int se = cha[deps[od][lo]]; // dout2(fi, se); answer(fi, se); } } // answer(0, 1); /* for (int j = 0; j < 50; ++j) { std::vector<int> w(M); for (int i = 0; i < M; ++i) { w[i] = 0; } long long toll = ask(w); } answer(0, N - 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...