平面几何
https://www.lanqiao.cn/problems/503/learning/?page=1&first_category_id=1&sort=students_count&name=平面切分
- 解释:
重点在于线段的去重和交点的去重
- 代码
#include <iostream>
#include <set>
using namespace std;
typedef pair<double, double> pei;
const int MAX = 1e5 + 5;
int N;
double A[MAX];
double B[MAX];
struct point{
double x, y;
point(double x, double y):x(x), y(y){
}
bool operator < (const point& p1) const{
return x < p1.x;
}
};
int main()
{
// 请在此输入您的代码
cin >> N;
for(int i = 0; i < N; i++) {
cin >> A[i] >> B[i];
}
set<pei> st;
int ans = 1;//记得一开始是一个面
for(int i = 0; i < N; i++) {
if(st.count(pei(A[i], B[i]))) {
continue;
}
//说明这里的不重合
int index = 0;
set<point> pt;
for(auto it : st) {
double a = A[i], b = B[i], c = it.first, d = it.second;
if(a == c) {
continue;
}
point newp((d - b)/(a - c), (a*d - b*c)/(a - c));
if(pt.count(newp)) {
continue;
}
index++;
pt.insert(newp);
}
st.insert(pei(A[i], B[i]));
ans += index + 1;
}
cout << ans;
return 0;
}