如题。我现在有如下一个构造凸包的代码:
class convex {
public:
struct point {
long double x, y;
point() {}
point(int _x, int _y) : x(_x), y(_y) {}
};
struct line {
long double k, b;
line(point a, point b) {
if (b.x - a.x == 0) { (this -> k = 1e12, this -> b = a.x); return; }
this -> k = (b.y - a.y) / (b.x - a.x);
this -> b = a.y - k * a.x;
}
long double at(long double x) { return k * x + b; }
long double slope() { return k; }
};
private:
vector <point> p;
long double slope(point a, point b) { return line(a, b).slope(); }
bool check_slope(line A, line B) { return compare(A.slope(), B.slope()) == -1; }
public:
void clear() { p.clear(); }
void add(point x) {
int siz = p.size();
while (siz >= 2 && check_slope(line(p[siz - 2], p[siz - 1]), line(p[siz - 1], x)))
p.pop_back(), siz--;
p.push_back(x);
}
bool check(point a, point b) {
point P;
if (p.size() == 1) P = p[0];
else {
int l = 0, r = p.size() - 2;
while (l < r) {
int mid = (l + r) >> 1;
if (check_slope(line(p[mid], p[mid + 1]), line(a, b))) r = mid;
else l = mid + 1;
}
if (check_slope(line(p[r], p[r + 1]), line(a, b))) P = p[r];
else P = p[r + 1];
}
return compare(line(a, b).at(P.x), P.y) == -1;
}
};
可以看到 convex::point 的构造函数接受两个参数。然而当我写如下代码的时候,他出现了错误:
rep (i, 1, n) p[i] = convex::point(read(), read());
我调试了很久才发现是输入有问题,当我将构造函数的 _x 和 _y 反转后,就正确了。
我测试了如下代码,答案也是正确的:
rep (i, 1, n) p[i].x = read(), p[i].y = read();
求助这个是固定从右往左执行,还是随编译器的改变而改变行为。