引言
题目链接:https://www.luogu.com.cn/problem/P8720
思路
首先可以画一个 n = 3 的图找规律:
可以发现划分的平面数有如下的规律:
-
重边只有首次出现的那条会影响结果
-
加入一条没有重边的直线,划分平面数 + 1
-
新加入的直线与之前加入的直线有 a 个不同的交点,则划分平面数 + a
代码
#include <bits/stdc++.h>
#define PDD std::pair<double,double>
#define N 1010
double a,b;
int n,res = 1;
std::set<PDD> lines;
int count(double a, double b) {
std::set<PDD> p; // 判断有多少个不同的交点
for (auto it = lines.begin(); it != lines.end() ; it ++ ) {
double c = it->first,d = it->second;
if(a != c) {
double x = (d - b) / (a - c);
double y = a * x + b;
p.insert({x,y});
}
}
return p.size();
}
int main() {
int n;
std::cin >> n;
for (int i = 0 ; i < n ; i ++ ) {
std::cin >> a >> b;
if(lines.find({a,b}) == lines.end()) { // 没有重边
res += count(a,b) + 1;
}
lines.insert({a,b});
}
std::cout << res << '\n';
return 0;
}
标签:std,int,double,lines,拆分,平面,重边
From: https://www.cnblogs.com/NachoNeko/p/18082844