给定n个 xi 和 yi 1=i=n 求对于每个i 是否有一对xjyj符合yjyi 且 xi-xj的绝对值小于等于yj-yi请使用C++并注意到 n=100000你应当使用更快的搜索方法如二分查找。
以下是使用C++实现的解决方案:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Point {
int x;
int y;
};
bool comparePoints(const Point& p1, const Point& p2) {
return p1.x < p2.x;
}
bool binarySearch(const vector<Point>& points, int targetY, int targetX) {
int left = 0;
int right = points.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (points[mid].y > targetY && abs(points[mid].x - targetX) <= abs(points[mid].y - targetY)) {
return true;
}
if (points[mid].y > targetY) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}
vector<bool> checkPairs(const vector<int>& x, const vector<int>& y) {
int n = x.size();
vector<Point> points(n);
for (int i = 0; i < n; i++) {
points[i].x = x[i];
points[i].y = y[i];
}
sort(points.begin(), points.end(), comparePoints);
vector<bool> result(n, false);
for (int i = 0; i < n; i++) {
result[i] = binarySearch(points, y[i], x[i]);
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> x(n), y(n);
for (int i = 0; i < n; i++) {
cin >> x[i] >> y[i];
}
vector<bool> result = checkPairs(x, y);
for (int i = 0; i < n; i++) {
cout << (result[i] ? "YES" : "NO") << endl;
}
return 0;
}
在主函数中,首先输入n,然后输入n个x和y的值。然后调用checkPairs函数计算每个点是否存在符合条件的配对。最后输出结果。
在checkPairs函数中,首先创建一个Point结构体的向量,每个点包含x和y的值。然后对这个向量按照x的值进行排序。接下来创建一个与结果大小相等的向量,初始化为false。然后遍历每个点,通过二分查找确定是否存在符合条件的配对。最后返回结果向量。
在二分查找函数binarySearch中,使用二分查找算法在已排序的点向量中查找符合条件的配对。left和right分别表示查找范围的左右边界。在每次循环中,计算中间索引mid。如果中间点满足条件,则返回true。如果中间点的y大于目标y,则说明符合条件的配对可能在左侧,将right更新为mid-1。如果中间点的y小于等于目标y,则说明符合条件的配对可能在右侧,将left更新为mid+1。最后,如果循环结束仍未找到符合条件的配对,则返回false。
整体的时间复杂度为O(nlogn),其中n为点的数量。排序的时间复杂度为O(nlogn),每个点进行二分查找的时间复杂度为O(logn),总共需要进行n次二分查找。
原文地址: https://www.cveoy.top/t/topic/jc8g 著作权归作者所有。请勿转载和采集!