这是用{+ 3}}编写的O(NlogN)解决方案,用C ++ 11编写。我用了closest pair problem。比较器可能会让人感到困惑:cmp
最初按x然后y对点进行排序,而compare_y
将std::complex for geometry中的点按y值排序。
以下是我得到的错误,然后是我的代码。
cp.cpp: In function ‘int main()’:
cp.cpp:49:95: error: expected primary-expression before ‘)’ token
for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {
^
cp.cpp:49:150: error: expected primary-expression before ‘)’ token
for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {
#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
// define x, y as real(), imag()
typedef complex<double> point;
#define x real()
#define y imag()
bool cmp(point a, point b) {
if (a.x < b.x) return true;
if (a.x - b.x < EPS && a.y < b.y) return true;
return false;
}
struct compare_y {
bool operator() (const point& lhs, const point& rhs) const{
if (lhs.y < rhs.y) return true;
}
};
int main() {
int n;
while (scanf("%d", &n) && n != 0) {
vector<point> coord;
for (int i=0; i<n; ++i) {
double xi, yi;
scanf("%lf%lf", &xi, &yi);
point t(xi, yi);
coord.push_back(t);
}
sort(coord.begin(), coord.end(), cmp);
double h = 10000000;
set<point, compare_y> s;
s.insert(coord[0]);
for (int i=1; i<n; ++i) {
for (auto pt:s) {
if (abs(pt-coord[i])+EPS > h) { // bound by x
s.erase(pt);
}
}
point t1 = coord[i]; t1.imag(t1.y - h);
point t2 = coord[i]; t2.imag(t2.y + h);
for (set<point>::iterator it = s.lower_bound(s.begin(), s.end(), t1, compare_y); it < s.upper_bound(s.begin(), s.end(), t2, compare_y); ++it) {
h = min(h, abs(*it-coord[i]));
}
s.insert(coord[i]);
}
if (h + EPS >= 10000)
printf("INFINITY\n");
else
printf("%.4lf\n", h);
}
}
答案 0 :(得分:3)
首先,不要使用<bits/stdc++.h>
。
其次,您将成员函数std::set::lower_bound()
与算法std::lower_bound()
混淆 - 它们采用不同的参数。成员函数只接受一个参数(其他三个是隐含的 - 集合和比较器的范围。虽然即使对于std::lower_bound()
,你也不正确地提供比较器,因为该参数需要是一个对象而你只是提供一个类型名称。
第三,s
是std::set<point, compare_y>
,因此这些成员函数返回std::set<point, compare_y>::iterator
而不是std::set<point>::iterator
。
第四,std::set<point, compare_y>::iterator
不是随机访问,因此没有定义operator<
。您需要使用!=
。
正确的行是:
for (std::set<point, compare_y>::iterator it = s.lower_bound(t1); it != s.upper_bound(t2); ++it) {
或只是:
for (auto it = s.lower_bound(t1); it != s.upper_bound(t2); ++it) {