55312023-07-11 20:36:06111Drónfutárcpp14Time limit exceeded 65/100601ms42764 KiB
#include <bits/stdc++.h>
using namespace std;

#define rand() (rand() | rand() << 16)

#define LSB(x) ((x) & -(x))

int prim(vector<vector<pair<int, int>>>& graph, int startVertex) {
    int N = graph.size();
    // Priority queue to store the edges and their weights
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    // Create a vector to track visited vertices
    vector<bool> visited(N, false);
    // Add the starting vertex to the priority queue
    pq.push(make_pair(0, startVertex));
    vector<pair<int, int>> mst;  // Minimum spanning tree
    while (!pq.empty()) {
        // Extract the minimum weight edge from the priority queue
        pair<int, int> curr = pq.top();
        pq.pop();
        int weight = curr.first;
        int vertex = curr.second;
        if (visited[vertex]) {
            continue;
        }
        // Mark the current vertex as visited
        visited[vertex] = true;
        // Add the current edge to the minimum spanning tree
        mst.push_back(make_pair(weight, vertex));
        // Iterate through all adjacent vertices of the current vertex
        for (pair<int, int>& edge : graph[vertex]) {
            int adjVertex = edge.first;
            int adjWeight = edge.second;
            if (!visited[adjVertex]) {
                // Add the adjacent vertex and its weight to the priority queue
                pq.push(make_pair(adjWeight, adjVertex));
            }
        }
    }
    // Find the maximum weight among the edges in the MST
    int maxWeight = 0;
    for (pair<int, int>& edge : mst) {
        maxWeight = max(maxWeight, edge.first);
    }
    return maxWeight;
}

struct Pt {
	int x, y;
};

int c1(Pt p) { return - p.x + p.y; }
int c2(Pt p) { return + p.x - p.y; }
int c3(Pt p) { return - p.x - p.y; }
int c4(Pt p) { return + p.x + p.y; }

int d1(Pt p) { return + p.x + p.y; }
int d2(Pt p) { return + p.x + p.y; }
int d3(Pt p) { return - p.x + p.y; }
int d4(Pt p) { return - p.x + p.y; }

int main() {
//	ifstream fin("be2.txt");
//	cin.rdbuf(fin.rdbuf());
	int N;
	cin >> N;
	vector<Pt> v(N);
	for (int i = 0; i < N; i++) {
		cin >> v[i].x >> v[i].y;
	}
	vector<int> w(N);
	iota(w.begin(), w.end(), 0);
	vector<vector<pair<int, int>>> g(N);
	vector<vector<int>> f(N + 1);
	vector<vector<int>> t(N + 1);
	// octant 1
	sort(w.begin(), w.end(), [&](auto a, auto b) { return v[a].y > v[b].y; });
	for (int i = 1; i <= N; i++) {
		int s = i - LSB(i);
		int e = i;
		f[i].assign(w.begin() + s, w.begin() + e);
		t[i].resize(e - s);
		sort(f[i].begin(), f[i].end(), [&](auto a, auto b) { return c1(v[a]) < c1(v[b]); });
		for (int j = 0, m = 0; j < e - s; j++) {
			if (d1(v[f[i][j]]) < d1(v[f[i][m]])) {
				m = j;
			}
			t[i][j] = f[i][m];
		}
	}
	for (int i = 0; i < N; i++) {
		int l = i, h = N - 1;
		while (l != h) {
			int m = (l + h + 1) / 2;
			if (v[w[m]].y == v[w[i]].y) {
				l = m;
			}
			else {
				h = m - 1;
			}
		}
		int r = -1;
		for (int j = l; j > 0; j -= LSB(j)) {
			l = -1, h = f[j].size() - 1;
			while (l != h) {
				int m = (l + h + 1) / 2;
				if (c1(v[f[j][m]]) < c1(v[w[i]])) {
					l = m;
				}
				else {
					h = m - 1;
				}
			}
			if (l >= 0 && (r == -1 || d1(v[t[j][l]]) < d1(v[r]))) {
				r = t[j][l];
			}
		}
		if (r != -1) {
			g[w[i]].push_back({r, d1(v[r]) - d1(v[w[i]])});
			g[r].push_back({w[i], d1(v[r]) - d1(v[w[i]])});
		}
	}
	// octant 4
	for (int i = 1; i <= N; i++) {
		int s = i - LSB(i);
		int e = i;
		sort(f[i].begin(), f[i].end(), [&](auto a, auto b) { return c4(v[a]) < c4(v[b]); });
		for (int j = 0, m = 0; j < e - s; j++) {
			if (d4(v[f[i][j]]) < d4(v[f[i][m]])) {
				m = j;
			}
			t[i][j] = f[i][m];
		}
	}
	for (int i = 0; i < N; i++) {
		int l = i, h;
		int r = -1;
		for (int j = l; j > 0; j -= LSB(j)) {
			l = -1, h = f[j].size() - 1;
			while (l != h) {
				int m = (l + h + 1) / 2;
				if (c4(v[f[j][m]]) <= c4(v[w[i]])) {
					l = m;
				}
				else {
					h = m - 1;
				}
			}
			if (l >= 0 && (r == -1 || d4(v[t[j][l]]) < d4(v[r]))) {
				r = t[j][l];
			}
		}
		if (r != -1) {
			g[w[i]].push_back({r, d4(v[r]) - d4(v[w[i]])});
			g[r].push_back({w[i], d4(v[r]) - d4(v[w[i]])});
		}
	}
	// octant 2
	sort(w.begin(), w.end(), [&](auto a, auto b) { return v[a].x > v[b].x; });
	for (int i = 1; i <= N; i++) {
		int s = i - LSB(i);
		int e = i;
		f[i].assign(w.begin() + s, w.begin() + e);
		sort(f[i].begin(), f[i].end(), [&](auto a, auto b) { return c2(v[a]) < c2(v[b]); });
		for (int j = 0, m = 0; j < e - s; j++) {
			if (d2(v[f[i][j]]) < d2(v[f[i][m]])) {
				m = j;
			}
			t[i][j] = f[i][m];
		}
	}
	for (int i = 0; i < N; i++) {
		int l = i, h;
		int r = -1;
		for (int j = l; j > 0; j -= LSB(j)) {
			l = -1, h = f[j].size() - 1;
			while (l != h) {
				int m = (l + h + 1) / 2;
				if (c2(v[f[j][m]]) <= c2(v[w[i]])) {
					l = m;
				}
				else {
					h = m - 1;
				}
			}
			if (l >= 0 && (r == -1 || d2(v[t[j][l]]) < d2(v[r]))) {
				r = t[j][l];
			}
		}
		if (r != -1) {
			g[w[i]].push_back({r, d2(v[r]) - d2(v[w[i]])});
			g[r].push_back({w[i], d2(v[r]) - d2(v[w[i]])});
		}
	}
	// octant 3
	sort(w.begin(), w.end(), [&](auto a, auto b) { return v[a].x < v[b].x; });
	for (int i = 1; i <= N; i++) {
		int s = i - LSB(i);
		int e = i;
		f[i].assign(w.begin() + s, w.begin() + e);
		sort(f[i].begin(), f[i].end(), [&](auto a, auto b) { return c3(v[a]) < c3(v[b]); });
		for (int j = 0, m = 0; j < e - s; j++) {
			if (d3(v[f[i][j]]) < d3(v[f[i][m]])) {
				m = j;
			}
			t[i][j] = f[i][m];
		}
	}
	for (int i = 0; i < N; i++) {
		int l = i, h = N - 1;
		while (l != h) {
			int m = (l + h + 1) / 2;
			if (v[w[m]].x == v[w[i]].x) {
				l = m;
			}
			else {
				h = m - 1;
			}
		}
		int r = -1;
		for (int j = l; j > 0; j -= LSB(j)) {
			l = -1, h = f[j].size() - 1;
			while (l != h) {
				int m = (l + h + 1) / 2;
				if (c3(v[f[j][m]]) < c3(v[w[i]])) {
					l = m;
				}
				else {
					h = m - 1;
				}
			}
			if (l >= 0 && (r == -1 || d3(v[t[j][l]]) < d3(v[r]))) {
				r = t[j][l];
			}
		}
		if (r != -1) {
			g[w[i]].push_back({r, d3(v[r]) - d3(v[w[i]])});
			g[r].push_back({w[i], d3(v[r]) - d3(v[w[i]])});
		}
	}
	cout << prim(g, 0) << endl;
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1944 KiB
2Time limit exceeded601ms28916 KiB
subtask215/15
3Accepted7ms4856 KiB
4Accepted7ms5136 KiB
5Accepted7ms5396 KiB
6Accepted7ms5624 KiB
7Accepted3ms5036 KiB
subtask315/15
8Accepted7ms4856 KiB
9Accepted7ms5136 KiB
10Accepted7ms5396 KiB
11Accepted7ms5624 KiB
12Accepted3ms5036 KiB
13Accepted4ms5540 KiB
14Accepted7ms5756 KiB
15Accepted7ms6024 KiB
16Accepted7ms6068 KiB
17Accepted7ms6024 KiB
subtask435/35
18Accepted7ms4856 KiB
19Accepted7ms5136 KiB
20Accepted7ms5396 KiB
21Accepted7ms5624 KiB
22Accepted3ms5036 KiB
23Accepted4ms5540 KiB
24Accepted7ms5756 KiB
25Accepted7ms6024 KiB
26Accepted7ms6068 KiB
27Accepted7ms6024 KiB
28Accepted7ms6316 KiB
29Accepted158ms19488 KiB
30Accepted250ms26440 KiB
31Accepted252ms27080 KiB
32Accepted150ms29744 KiB
subtask50/35
33Accepted7ms4856 KiB
34Accepted7ms5136 KiB
35Accepted7ms5396 KiB
36Accepted7ms5624 KiB
37Accepted3ms5036 KiB
38Accepted4ms5540 KiB
39Accepted7ms5756 KiB
40Accepted7ms6024 KiB
41Accepted7ms6068 KiB
42Accepted7ms6024 KiB
43Accepted7ms6316 KiB
44Accepted158ms19488 KiB
45Accepted250ms26440 KiB
46Accepted252ms27080 KiB
47Accepted150ms29744 KiB
48Accepted497ms42764 KiB
49Time limit exceeded570ms33496 KiB
50Time limit exceeded547ms33436 KiB
51Time limit exceeded568ms33492 KiB
52Time limit exceeded555ms33432 KiB