Submission #1336499

#TimeUsernameProblemLanguageResultExecution timeMemory
1336499WongYiKai통행료 (IOI18_highway)C++20
0 / 100
10 ms3028 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void find_pair(int n, std::vector<int> u, std::vector<int> v, int a, int b) {
  int m = u.size();
  vector<int> w(m,0);
  int length = ask(w)/a;
  ll l=1,r=m;
  while (l<r){
    ll mid = (l+r)>>1;
    for (int i=0;i<m;i++) w[i] = 0;
    for (int i=0;i<mid;i++){
      w[i] = 1;
    }
    if (ask(w) > length*a){
      r=mid;
    }
    else l=mid+1;
  }
  l--;
  for (int i=0;i<l;i++) w[i] = 1;
  vector<pair<ll,ll>> adj[n];
  for (int i=l;i<m;i++){
    adj[u[i]].push_back({v[i],i});
    adj[v[i]].push_back({u[i],i});
  }
  ll dist[n];
  memset(dist,-1,sizeof(dist));
  ll root = u[l];
  queue<pair<ll,ll>> bfs;
  bfs.push({root,0});
  ll visited[n];
  memset(visited,0,sizeof(visited));
  visited[root] = 1;
  while (!bfs.empty()){
    ll x = bfs.front().first, d = bfs.front().second;
    if (dist[x] != -1 && dist[x] <= d) continue;
    dist[x] = d;
    bfs.pop();
    for (auto nb:adj[x]){
      ll nx = nb.first;
      if (visited[nx]) continue;
      bfs.push({nx,d+1});
      visited[nx] = 1;
    }
  }
  ll dist2[n];
  memset(dist2,-1,sizeof(dist2));
  memset(visited,0,sizeof(visited));
  root = v[l];
  bfs.push({root,0});
  visited[root] = 1;
  while (!bfs.empty()){
    ll x = bfs.front().first, d = bfs.front().second;
    if (dist2[x] != -1 && dist2[x] <= d) continue;
    dist2[x] = d;
    bfs.pop();
    for (auto nb:adj[x]){
      ll nx = nb.first;
      if (visited[nx]) continue;
      bfs.push({nx,d+1});
      visited[nx] = 1;
    }
  }
  vector<pair<ll,ll>> left,right;
  for (int i=0;i<n;i++){
    if (dist[i] < dist2[i]) left.push_back({dist[i],i});
    else if (dist[i] > dist2[i]) right.push_back({dist2[i],i});
  }
  sort(left.begin(),left.end(),greater<>());
  sort(right.begin(),right.end(),greater<>());
  vector<ll> ql,qr;
  for (int i=0;i<left.size()-1;i++){
    for (pair<ll,ll> nb:adj[left[i].second]){
      if (left[i].first > dist[nb.first]) {
        ql.push_back(nb.second);
        break;
      }
    }
  }
  for (int i=0;i<right.size()-1;i++){
    for (pair<ll,ll> nb:adj[right[i].second]){
      if (right[i].first > dist2[nb.first]) {
        qr.push_back(nb.second);
        break;
      }
    }
  }
  ll l2=0,r2=left.size()-1;
  while (l2<r2){
    ll mid = (l2+r2)>>1;
    for (int i=0;i<=mid;i++){
      w[ql[i]] = 1;
    }
    if (ask(w) > length*a) r2=mid;
    else l2=mid+1;
  }
  ll l3=0,r3=right.size()-1;
  while (l3<r3){
    ll mid = (l3+r3)>>1;
    for (int i=0;i<=mid;i++){
      w[qr[i]] = 1;
    }
    if (ask(w) > length*a) r3=mid;
    else l3=mid+1;
  }
  //l2 l3 is the guys
  /*
  cout << l << "\n";
  cout << left[l2].second << ' ' << right[l3].second << "\n";
  for (int i=0;i<left.size();i++) cout << left[i].second << ' ';
  cout << "\n";
  for (int i=0;i<right.size();i++) cout << right[i].second << ' ';
  cout << "\n";
  for (int i=0;i<n;i++) cout << dist[i] << ' ' << dist2[i] << "\n";
  */
  answer(left[l2].second, right[l3].second);
}
#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...