QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#122624 | #5463. Range Closest Pair of Points Query | Ender32k | WA | 171ms | 50204kb | C++20 | 4.2kb | 2023-07-10 20:42:25 | 2023-07-10 20:42:29 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
using namespace std;
namespace vbzIO {
char ibuf[(1 << 20) + 1], *iS, *iT;
#if ONLINE_JUDGE
#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
#else
#define gh() getchar()
#endif
#define mt make_tuple
#define mp make_pair
#define fi first
#define se second
#define pc putchar
#define pb emplace_back
#define ins insert
#define era erase
typedef tuple<int, int, int> tu3;
typedef pair<int, int> pi;
inline int rd() {
char ch = gh();
int x = 0;
bool t = 0;
while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
return t ? ~(x - 1) : x;
}
inline void wr(ll x) {
if (x < 0) {
x = ~(x - 1);
putchar('-');
}
if (x > 9)
wr(x / 10);
putchar(x % 10 + '0');
}
}
using namespace vbzIO;
int max(int i, int j) { return i > j ? i : j; }
ll min(ll i, ll j) { return i > j ? j : i; }
mt19937 rnd(time(0));
const int N = 2.5e5 + 250;
const int B = 510;
const int P = 998244353;
const ll inf = 2e18;
const int W = 1000;
int f[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int n, m, b, x[N], y[N], id[N];
vector<pi> qr[N];
vector<int> g[N];
ll ans[N];
map<pi, pi> t;
ll dis(int i, int j) {
return 1ll * (x[i] - x[j]) * (x[i] - x[j]) + 1ll * (y[i] - y[j]) * (y[i] - y[j]);
}
int pos[N], lp[N], rp[N];
ll mn[B], a[N];
void mdf(int p, ll q) {
a[p] = min(a[p], q);
mn[pos[p]] = min(mn[pos[p]], q);
}
ll qry(int p, int q) {
if (pos[p] == pos[q]) {
ll res = inf;
for (int i = p; i <= q; i++)
res = min(res, a[i]);
return res;
}
ll res = inf;
for (int i = pos[p] + 1; i <= pos[q] - 1; i++)
res = min(res, mn[i]);
for (int i = p; i <= rp[pos[p]]; i++)
res = min(res, a[i]);
for (int i = lp[pos[q]]; i <= q; i++)
res = min(res, a[i]);
return res;
}
int X(int i, int k) { return x[i] >> k; }
int Y(int i, int k) { return y[i] >> k; }
int main() {
n = rd(), m = rd(), b = sqrt(n);
for (int i = 1; i <= b; i++)
lp[i] = (i - 1) * b + 1, rp[i] = i * b;
if (rp[b] < n) b++, lp[b] = rp[b - 1] + 1, rp[b] = n;
for (int i = 1; i <= b; i++) {
mn[i] = inf;
for (int j = lp[i]; j <= rp[i]; j++)
pos[j] = i;
}
for (int i = 1; i <= n; i++) x[i] = rd(), y[i] = rd(), id[i] = i, a[i] = inf;
for (int i = 1, l, r; i <= m; i++) l = rd(), r = rd(), qr[r].pb(mp(l, i));
for (int k = 0; k <= 27; k++) {
for (int i = 1; i <= n; i++) id[i] = i;
sort(id + 1, id + n + 1, [&] (int &i, int &j) { return X(i, k) == X(j, k) ? Y(i, k) < Y(j, k) : X(i, k) < X(j, k); });
for (int l = 1; l <= n; l++) {
int r = l;
while (r < n && X(id[r + 1], k) == X(id[l], k) && Y(id[r + 1], k) == Y(id[l], k)) r++;
// cout << l << " " << r << endl;
sort(id + l, id + r + 1), t[mp(X(id[l], k), Y(id[l], k))] = mp(l, r);
for (int i = l; i <= r; i++)
for (int j = i + 1; j <= min(r, i + 3); j++)
g[id[j]].pb(id[i]);
l = r;
}
for (int l = 1; l <= n; l++) {
int r = l;
while (r < n && X(id[r + 1], k) == X(id[l], k) && Y(id[r + 1], k) == Y(id[l], k)) r++;
int/* r = t[mp(X(id[l], k), Y(id[l], k))].se, */sx = X(id[l], k), sy = Y(id[l], k);
for (int i = 0; i <= 3; i++) {
if (!t.count(mp(sx + f[i][0], sy + f[i][1]))) continue;
int tx = sx + f[i][0], ty = sy + f[i][1];
auto [tl, tr] = t[mp(tx, ty)];
// cout << l << " " << r << " " << tl << " " << tr << endl;
vector<int> tp;
tp.ins(tp.end(), id + l, id + r + 1);
tp.ins(tp.end(), id + tl, id + tr + 1);
inplace_merge(tp.begin(), tp.begin() + r - l + 1, tp.end());
for (int p = 0; p < tp.size(); p++)
for (int q = p + 1; q <= min(p + 3, tp.size() - 1); q++)
g[tp[q]].pb(tp[p]);
}
l = r;
}
t.clear();
}
for (int i = 1; i <= n; i++) {
for (int j : g[i]) mdf(j, dis(i, j))/*, cout << i << " " << j << endl*/;
for (auto [j, k] : qr[i]) ans[k] = qry(j, i);
}
for (int i = 1; i <= m; i++)
wr(ans[i]), puts("");
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 24024kb
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: 5ms
memory: 23960kb
input:
2 1 1 1 1 1 1 2
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: 0
Accepted
time: 5ms
memory: 24020kb
input:
2 1 1 100000000 100000000 1 1 2
output:
19999999600000002
result:
ok 1 number(s): "19999999600000002"
Test #4:
score: 0
Accepted
time: 149ms
memory: 48424kb
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
Wrong Answer
time: 171ms
memory: 50204kb
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...
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 10 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 1 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:
wrong answer 18348th numbers differ - expected: '25', found: '29'