제출 #284052

#제출 시각아이디문제언어결과실행 시간메모리
284052milleniumEeee통행료 (IOI18_highway)C++14
11 / 100
159 ms8676 KiB
#include "highway.h"
#include <bits/stdc++.h>
#define pii pair<int, int>
#define szof(s) (int)s.size()
#define ll long long
#define fr first
#define sc second

using namespace std;

const int N = 90004;
vector <int> g[N];
int x[N], y[N];
int n, m, a, b;
int S, T;
vector <int> w;

map <pii, bool> mp;

struct SmallSolve {  
  int dfs(int v, int par) {
    for (int to : g[v]) {
      if (to == par) {
        continue;
      }
      if (mp.count({v, to})) {
        return dfs(to, v);
      }
    }
    return v;
  }
  void solve(int NN, vector<int> U, vector<int> V, int A, int B) {
    n = NN;
    m = U.size();
    a = A;
    b = B;
    w.resize(m, 1);
    for (int i = 0; i < m; i++) {
      x[i] = U[i];
      y[i] = V[i];
      g[x[i]].push_back(y[i]);
      g[y[i]].push_back(x[i]);
    }
    ll before = ask(w);
    for (int i = 0; i < m; i++) {
      w[i] = 0;
      int nxt = ask(w);
      if (nxt < before) {
        w[i] = 0;
        before = nxt;
      } else {
        w[i] = 1;
      }
    }
    for (int i = 0; i < m; i++) {
      if (w[i] == 0) {
        mp[{x[i], y[i]}] = 1;
        mp[{y[i], x[i]}] = 1;
      }
    }
    S = 0;
    T = dfs(0, -1);
    answer(S, T);
  }
}subtask1;

struct LineSolve {
  vector <int> w;
  
  bool need(int NN, vector<int> U, vector<int> V, int A, int B) {
    bool ok = 1;
    ok &= (NN - 1 == szof(U));
    for (int i = 0; i < szof(U); i++) {
      ok &= (U[i] == i && V[i] == i + 1);
    }
    return ok;
  }
  
  void init(int l, int r) {
    for (int i = 0; i < m; i++) {
      if (l <= i && i <= r) {
        w[i] = 0;
      } else {
        w[i] = 1;
      }
    }
  }
  
  void solve(int NN, vector<int> U, vector<int> V, int A, int B) {
    n = NN;
    m = U.size();
    a = A;
    b = B;
    w.resize(m, 1);
    long long before = ask(w);
    for (int i = 0; i < m; i++) {
      x[i] = U[i];
      y[i] = V[i];
      g[x[i]].push_back(y[i]);
      g[y[i]].push_back(x[i]);
    }
    int l = -1, r = m - 1;
    while (r - l > 1) {
      int mid = (l + r) >> 1;
      init(0, mid);
      if (ask(w) < before) {
        r = mid;
      } else {
        l = mid;
      }
    }
    S = (l == -1 ? x[0] : y[l]);
    l = 0, r = m;
    while (r - l > 1) {
      int mid = (l + r) >> 1;
      init(mid, m - 1); 
      if (ask(w) < before) {
        l = mid;
      } else {
        r = mid;
      }
    }
    T = (r == m ? y[m - 1] : x[r]);
    answer(S, T);
  }
}subtask3;

void find_pair(int NN, vector<int> U, vector<int> V, int A, int B) {
  if (NN <= 100 && szof(U) == NN - 1) {
    subtask1.solve(NN, U, V, A, B);
  }
  if (subtask3.need(NN, U, V, A, B)) {
    subtask3.solve(NN, U, V, A, B);
  }
}

/*

10
9
4
9
4
1
4 6
9 5
5 0
8 2
1 7
7 4
4 2
2 9
3 9

*/
#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...