记录编号 601178 评测结果 AAAAAAAAAA
题目名称 3117.专家系统 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 4.401 s
提交时间 2025-06-03 21:27:03 内存使用 8.46 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
typedef long long ll;
#define max(__a, __b) [&](ll _a, ll _b) {return _a > _b ? _a : _b;} ((__a), (__b))
#define min(__a, __b) [&](ll _a, ll _b) {return _a < _b ? _a : _b;} ((__a), (__b))
#define isdigit(ch) ((ch) >= '0' && (ch) <= '9')
#define ls(root) root << 1
#define rs(root) root << 1 | 1

template <typename T>
T read() {
  T res = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
  return res * f;
}

template <typename T>
void write(T x, char ed = '\n') {
  if (x < 0) putchar('-'), x = -x;
  static int sta[64], top;
  do {
    sta[++top] = x % 10;
    x /= 10;
  } while(x);
  while (top) {
    putchar(sta[top--] ^ 48);
  }
  putchar(ed);
}

const int MAXN = 1e5 + 10;
const ll INF = 0x7fffffffffffffff;

struct NODE {
  ll maxx, lazy;
} node[MAXN << 2];

void PushUp(int root) {
  node[root].maxx = max(node[ls(root)].maxx, node[rs(root)].maxx);
}

void PushDown(int root, int lt, int rt) {
  if (node[root].lazy) {
    node[ls(root)].maxx += node[root].lazy;
    node[ls(root)].lazy += node[root].lazy;
    node[rs(root)].maxx += node[root].lazy;
    node[rs(root)].lazy += node[root].lazy;
    node[root].lazy = 0;
  }
}

void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
  if (lt == lq && rt == rq) {
    node[root].maxx += val;
    node[root].lazy += val;
    return ;
  }
  PushDown(root, lt, rt);
  int mid = lt + ((rt - lt) >> 1);
  if (rq <= mid) {
    AddSeq(ls(root), lt, mid, lq, rq, val);
  } else if (lq > mid) {
    AddSeq(rs(root), mid + 1, rt, lq, rq, val);
  } else {
    AddSeq(ls(root), lt, mid, lq, mid, val);
    AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
  }
  PushUp(root);
}

struct POINT {
  ll x, y;
} a[MAXN];
ll ysort[MAXN];
ll ydisc[MAXN];
ll ybefore[MAXN];

ll n, k;

bool check(ll s) {
  for (int i = 1; i <= n; ++i) {
    ybefore[i] = ::std::lower_bound(ysort + 1, ysort + n + 1, a[i].y - s) - ysort;
  }
  //printf("s=%d\n", s);
  //printf("yorign : ");
  //for (int i = 1; i <= n; ++i) {
  //  printf("%d%c", a[i].y, " \n"[i == n]);
  //}
  //printf("ysort  : ");
  //for (int i = 1; i <= n; ++i) {
  //  printf("%d%c", ysort[i], " \n"[i == n]);
  //}
  //printf("ydisc  : ");
  //for (int i = 1; i <= n; ++i) {
  //  printf("%d%c", ydisc[i], " \n"[i == n]);
  //}
  //printf("ybefore: ");
  //for (int i = 1; i <= n; ++i) {
  //  printf("%d%c", ybefore[i], " \n"[i == n]);
  //}
  //printf("\n");
  memset(node, 0, sizeof node);
  for (int i = 1, j = 1; i <= n; AddSeq(1, 1, n, ybefore[i], ydisc[i], -1)/*, printf("SegAdd 1, 1, n, %d, %d, -1\n", ybefore[i], ydisc[i])*/, ++i) {
    while (a[i].x + s >= a[j].x && j <= n) AddSeq(1, 1, n, ybefore[j], ydisc[j], 1)/*, printf("SegAdd 1, 1, n, %d, %d, 1\n", ybefore[j], ydisc[j])*/, ++j;
    if (node[1].maxx >= k) return true;
  }
  return false;
}

int main() {
  freopen("expert.in", "r", stdin);
  freopen("expert.out", "w", stdout);
  n = read<ll>(), k = read<ll>();
  ll xmax = -INF, xmin = INF, ymax = -INF, ymin = INF;
  for (int i = 1; i <= n; ++i) {
    a[i].x = read<ll>(), a[i].y = read<ll>();
    xmax = max(xmax, a[i].x);
    xmin = min(xmin, a[i].x);
    ymax = max(ymax, a[i].y);
    ymin = min(ymin, a[i].y);
  }
  ::std::sort(a + 1, a + n + 1, [](POINT x, POINT y) {
    if (x.x != y.x) return x.x < y.x;
    return x.y < y.y;
  });
  for (int i = 1; i <= n; ++i) ysort[i] = a[i].y;
  ::std::sort(ysort + 1, ysort + n + 1);
  for (int i = 1; i <= n; ++i) {
    ydisc[i] = ::std::lower_bound(ysort + 1, ysort + n + 1, a[i].y) - ysort;
  }
  ll l = 1, r = max(xmax - xmin, ymax - ymin), ans = max(xmax - xmin, ymax - ymin);
  //fprintf(stdout, "%lld %lld %lld %lld\n", xmax, xmin, ymax, ymin);
  while (l <= r) {
    ll mid = l + ((r - l) >> 1);
    if (check(mid)) {
      ans = mid;
      r = mid - 1;
      //printf("r = mid - 1\n");
    } else {
      l = mid + 1;
      //printf("l = mid + 1\n");
    }
  }
  write(ans);
  return 0;
}