Submission #423174

#TimeUsernameProblemLanguageResultExecution timeMemory
423174TangentWerewolf (IOI18_werewolf)C++17
34 / 100
745 ms34680 KiB
#include "werewolf.h"
#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vii;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<vii> vvii;
typedef vector<vll> vvll;
typedef vector<vpii> vvpii;
typedef vector<vpll> vvpll;

#define ffor(i, a, b) for (ll i = a; i < b; i++)
#define rep(i, n) ffor(i, 0, n)
#define forin(x, a) for (auto &x: a)
#define all(a) a.begin(), a.end()

std::vector<int> check_validity(int n, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
  int Q = S.size();
  vii ord(n), pos(n);
  vvii adj(n);
  rep(i, X.size()) {
    adj[X[i]].emplace_back(Y[i]);
    adj[Y[i]].emplace_back(X[i]);
  }
  rep(i, n) {
    if (adj[i].size() == 1) {
      ord[0] = i;
      ord[1] = adj[i][0];
      int curr = 1;
      while (curr < n - 1) {
        forin(x, adj[ord[curr]]) {
          if (x != ord[curr - 1]) {
            ord[curr + 1] = x;
            break;
          }
        }
        curr++;
      }
      break;
    }
  }
  rep(i, n) {
    pos[ord[i]] = i;
  }

  vii tmin(2 * n), tmax(2 * n);
  rep(i, n) {
    tmin[n + i] = tmax[n + i] = ord[i];
  }
  for (int i = n - 1; i >= 1; i--) {
    tmin[i] = min(tmin[i * 2], tmin[i * 2 + 1]);
    tmax[i] = max(tmax[i * 2], tmax[i * 2 + 1]);
  }

  auto minquery = [&](int l, int r) {
    l += n;
    r += n;
    int res = n;
    while (l < r) {
      if (l % 2) res = min(res, tmin[l++]);
      if (r % 2) res = min(res, tmin[--r]);
      l /= 2;
      r /= 2;
    }
    return res;
  };
  auto maxquery = [&](int l, int r) { //[l,r)
    l += n;
    r += n;
    int res = -1;
    while (l < r) {
      if (l % 2) res = max(res, tmax[l++]);
      if (r % 2) res = max(res, tmax[--r]);
      l /= 2;
      r /= 2;
    }
    return res;
  };

  vii res(Q);
  rep(i, Q) {
    if (pos[S[i]] < pos[E[i]]) {
      if (minquery(pos[S[i]], pos[E[i]] + 1) >= L[i]) {
        res[i] = 1;
        continue;
      }
      int lo = pos[S[i]] + 1, hi = pos[E[i]];
      while (lo < hi) {
        int mid = (lo + hi) / 2;
        if (minquery(pos[S[i]], mid + 1) < L[i]) {
          hi = mid;
        } else {
          lo = mid + 1;
        }
      }
      if (maxquery(lo - 1, pos[E[i]] + 1) <= R[i]) {
        res[i] = 1;
      }
    } else {
      swap(S[i], E[i]);
      if (maxquery(pos[S[i]], pos[E[i]] + 1) <= R[i]) {
        res[i] = 1;
        continue;
      }
      int lo = pos[S[i]] + 1, hi = pos[E[i]];
      while (lo < hi) {
        int mid = (lo + hi) / 2;
        if (maxquery(pos[S[i]], mid + 1) > R[i]) {
          hi = mid;
        } else {
          lo = mid + 1;
        }
      }
      if (minquery(lo - 1, pos[E[i]] + 1) >= L[i]) {
        res[i] = 1;
      }
    }
  }
  return res;
}

Compilation message (stderr)

werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:18:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 | #define ffor(i, a, b) for (ll i = a; i < b; i++)
      |                                        ^
werewolf.cpp:19:19: note: in expansion of macro 'ffor'
   19 | #define rep(i, n) ffor(i, 0, n)
      |                   ^~~~
werewolf.cpp:29:3: note: in expansion of macro 'rep'
   29 |   rep(i, X.size()) {
      |   ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...