제출 #284955

#제출 시각아이디문제언어결과실행 시간메모리
284955rama_pangCity (JOI17_city)C++14
30 / 100
843 ms57544 KiB
#include "Encoder.h"
#include <bits/stdc++.h>
using namespace std;

void Encode(int N, int A[], int B[]) {
  auto EncodePair = [&](int u, int v) -> long long { // u <= v
    static const int MAX = 250005;
    static vector<long long> num(MAX);
    static bool first = true;
    if (first) {
      num[0] = MAX;
      for (int i = 1; i < MAX; i++) {
        num[i] = MAX - i;
        num[i] += num[i - 1];
      }
    }
    first = false;
    return (u > 0 ? num[u - 1] : 0) + (v - u);
  };

  auto DecodePair = [&](long long x) -> pair<int, int> { // u <= v
    static const int MAX = 250005;
    int lo = 0, hi = MAX - 1, u, v;
    while (lo < hi) {
      int md = (lo + hi + 1) / 2;
      if (EncodePair(md, md) <= x) {
        lo = md;
      } else {
        hi = md - 1;
      }
    }
    u = lo;
    lo = u, hi = MAX - 1;
    while (lo < hi) {
      int md = (lo + hi + 1) / 2;
      if (EncodePair(u, md) <= x) {
        lo = md;
      } else {
        hi = md - 1;
      }
    }
    v = lo;
    return {u, v};
  };

  vector<vector<int>> adj(N);
  for (int i = 0; i + 1 < N; i++) {
    adj[A[i]].emplace_back(B[i]);
    adj[B[i]].emplace_back(A[i]);
  }
  int timer = 0;
  vector<int> st(N), et(N);
  function<void(int, int)> Dfs = [&](int u, int p) {
    st[u] = timer++;
    for (auto v : adj[u]) if (v != p) {
      Dfs(v, u);
    }
    et[u] = timer - 1;
  };
  Dfs(0, -1);
  for (int i = 0; i < N; i++) {
    Code(i, EncodePair(st[i], et[i]));
  }
}
#include "Device.h"
#include <bits/stdc++.h>
using namespace std;

void InitDevice() {}

int Answer(long long S, long long T) {
  auto EncodePair = [&](int u, int v) -> long long { // u <= v
    static const int MAX = 250005;
    static vector<long long> num(MAX);
    static bool first = true;
    if (first) {
      num[0] = MAX;
      for (int i = 1; i < MAX; i++) {
        num[i] = MAX - i;
        num[i] += num[i - 1];
      }
    }
    first = false;
    return (u > 0 ? num[u - 1] : 0) + (v - u);
  };

  auto DecodePair = [&](long long x) -> pair<int, int> { // u <= v
    static const int MAX = 250005;
    int lo = 0, hi = MAX - 1, u, v;
    while (lo < hi) {
      int md = (lo + hi + 1) / 2;
      if (EncodePair(md, md) <= x) {
        lo = md;
      } else {
        hi = md - 1;
      }
    }
    u = lo;
    lo = u, hi = MAX - 1;
    while (lo < hi) {
      int md = (lo + hi + 1) / 2;
      if (EncodePair(u, md) <= x) {
        lo = md;
      } else {
        hi = md - 1;
      }
    }
    v = lo;
    return {u, v};
  };

  int stx, etx, sty, ety;
  tie(stx, etx) = DecodePair(S);
  tie(sty, ety) = DecodePair(T);

  if (sty <= stx && etx <= ety) {
    return 0;
  } else if (stx <= sty && ety <= etx) {
    return 1;
  } else {
    return 2;
  }
}

컴파일 시 표준 에러 (stderr) 메시지

Encoder.cpp: In function 'void Encode(int, int*, int*)':
Encoder.cpp:21:8: warning: variable 'DecodePair' set but not used [-Wunused-but-set-variable]
   21 |   auto DecodePair = [&](long long x) -> pair<int, int> { // u <= v
      |        ^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...