QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#122624#5463. Range Closest Pair of Points QueryEnder32kWA 171ms50204kbC++204.2kb2023-07-10 20:42:252023-07-10 20:42:29

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-10 20:42:29]
  • 评测
  • 测评结果:WA
  • 用时:171ms
  • 内存:50204kb
  • [2023-07-10 20:42:25]
  • 提交

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'