QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#684583 | #5463. Range Closest Pair of Points Query | ucup-team5217 | RE | 159ms | 18784kb | C++23 | 4.2kb | 2024-10-28 14:31:41 | 2024-10-28 14:31:45 |
Judging History
answer
/**
* @file 5463.cpp
* @author Macesuted ([email protected])
* @date 2024-10-28
*
* @copyright Copyright (c) 2024
*
*/
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
#define endl '\n'
#endif
namespace IO {
const int SIZE = 1 << 20;
char Ibuf[SIZE], *Il = Ibuf, *Ir = Ibuf, Obuf[SIZE], *Ol = Obuf, *Or = Ol + SIZE - 1;
int cache[100];
void fill(void) { return Ir = (Il = Ibuf) + fread(Ibuf, 1, SIZE, stdin), void(); }
void flush(void) { return fwrite(Obuf, 1, Ol - Obuf, stdout), Ol = Obuf, void(); }
char getch(void) { return Il == Ir ? fill(), Il == Ir ? EOF : *Il++ : *Il++; }
void putch(char x) { return *Ol++ = x, Ol == Or && (flush(), 0), void(); }
template <typename T = int>
T read(void) {
T x = 0, f = +1;
char c = getch();
while (c < '0' || c > '9') (c == '-') && (f = -f), c = getch();
while ('0' <= c && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getch();
return x * f;
}
template <typename T>
void write(T x) {
if (!x) return putch('0');
if (x < 0) putch('-'), x = -x;
int top = 0;
while (x) cache[top++] = x % 10, x /= 10;
while (top) putch(cache[--top] ^ 48);
return;
}
struct Flusher_ {
~Flusher_() { flush(); }
} io_flusher_;
} // namespace IO
using IO::putch;
using IO::read;
using IO::write;
bool mem1;
#define maxn 250005
#define maxlgv 28
#define B 500
typedef pair<int, int> pii;
pii a[maxn];
int64_t sqr(int64_t v) { return v * v; }
int64_t dist(int x, int y) { return sqr(a[x].first - a[y].first) + sqr(a[x].second - a[y].second); }
class Block {
private:
int n;
int64_t a[maxn], b[maxn];
public:
Block(void) {
for (int i = 0; i < maxn; i++) a[i] = b[i] = INT64_MAX;
}
void resize(int _n) { return n = _n, void(); }
void add(int p, int64_t v) { return a[p] = min(a[p], v), b[p / B] = min(b[p / B], v), void(); }
int64_t query(int p) {
int64_t ans = INT64_MAX;
int q = p;
while (q / B == p / B) ans = min(ans, a[q++]);
while (q / B <= n / B) ans = min(ans, b[q / B]), q += B;
return ans;
}
} BLK;
class Dime {
private:
int64_t lim;
unordered_map<int64_t, deque<int>> list;
queue<int> all;
static int64_t _(int64_t x, int64_t y) { return x * int64_t(1e9) + y; }
public:
void setLim(int64_t v) { return lim = v, void(); }
void insert(int p) {
int x = a[p].first / lim / 2, y = a[p].second / lim / 2, del = 0;
for (int tx = x - 1; tx <= x + 1; tx++)
for (int ty = y - 1; ty <= y + 1; ty++)
if (list.find(_(tx, ty)) != list.end())
for (auto q : list[_(tx, ty)]) {
int64_t d = dist(p, q);
BLK.add(q, d);
if (d < lim) del = max(del, q);
}
while (!all.empty() && all.front() <= del) {
int q = all.front();
all.pop();
int tx = a[q].first / lim / 2, ty = a[q].second / lim / 2;
list[_(tx, ty)].pop_front();
if (list[_(tx, ty)].empty()) list.erase(_(tx, ty));
}
list[_(x, y)].push_back(p), all.push(p);
assert(list[_(x, y)].size() <= 16);
return;
}
};
Dime dims[maxlgv];
vector<pii> ques[maxn];
int64_t ans[maxn];
void solve(void) {
int n = read(), q = read();
for (int i = 1; i <= n; i++) a[i].first = read(), a[i].second = read();
for (int i = 1, l, r; i <= q; i++) l = read(), r = read(), ques[r].emplace_back(l, i);
for (int i = 0; i < maxlgv; i++) dims[i].setLim((int64_t)1 << i);
BLK.resize(n);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < maxlgv; j++) dims[j].insert(i);
for (auto [l, id] : ques[i]) ans[id] = BLK.query(l);
}
for (int i = 1; i <= q; i++) write(ans[i]), putch('\n');
return;
}
bool mem2;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
#ifdef LOCAL
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
#endif
int _ = 1;
while (_--) solve();
#ifdef LOCAL
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
#endif
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 9816kb
input:
5 5 2 4 1 1 3 3 5 1 4 2 1 5 2 3 2 4 3 5 1 3
output:
2 8 8 2 2
result:
ok 5 number(s): "2 8 8 2 2"
Test #2:
score: 0
Accepted
time: 3ms
memory: 11836kb
input:
2 1 1 1 1 1 1 2
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: 0
Accepted
time: 3ms
memory: 11808kb
input:
2 1 1 100000000 100000000 1 1 2
output:
19999999600000002
result:
ok 1 number(s): "19999999600000002"
Test #4:
score: 0
Accepted
time: 159ms
memory: 18784kb
input:
20000 250000 3 10 5 4 4 7 1 5 2 1 10 6 2 3 8 4 2 1 8 5 9 8 7 7 4 5 2 7 9 4 9 10 3 2 9 5 10 2 9 2 3 1 9 9 6 5 9 5 9 10 9 1 1 2 8 8 3 4 7 6 6 2 6 8 6 6 8 4 10 2 1 1 10 2 8 3 4 4 5 5 5 1 4 9 7 6 6 8 6 4 1 6 10 3 3 2 4 10 6 8 9 7 2 10 7 8 10 7 3 2 5 1 6 4 7 9 1 3 4 9 4 8 9 4 5 2 2 2 9 2 9 2 9 6 6 9 8 7 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 250000 numbers
Test #5:
score: -100
Runtime Error
input:
20000 250000 72 45 72 34 34 10 20 96 79 39 43 5 72 49 56 85 1 72 44 70 73 89 69 76 49 89 57 38 39 9 33 47 22 3 96 41 90 82 25 6 72 92 73 38 53 21 16 88 59 9 54 2 14 6 7 94 99 68 27 82 70 50 81 81 60 81 2 98 33 19 98 9 35 36 49 66 86 7 3 95 32 89 62 42 68 88 65 16 94 6 85 10 51 69 90 36 70 87 13 79 4...