优化代码使时间复杂度降至On^2logn及以下:#includebitsstdtr1c++husing namespace std;inline static const nullptr_t _= ios_basesync_with_stdio0; cintienullptrcouttienullptr; return nullptr;;double distanceint x1
#include<bits/stdtr1c++.h> using namespace std; inline static const nullptr_t _={ ios_base::sync_with_stdio(0); cin.tie(nullptr),cout.tie(nullptr); return nullptr; }(); double distance(int x1, int y1, int x2, int y2) { return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); } double triangleArea(int x1, int y1, int x2, int y2, int x3, int y3) { double area = 0.5 * abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)); return area; } double totalTriangleArea(vector<pair<int, int>>& points) { int n = points.size(); double totalArea = 0.0;
unordered_map<int, unordered_map<int, int>> hash;
for (int i = 0; i < n; i++) {
hash[points[i].first][points[i].second] = i;
}
vector<double> distances;
for (int i = 0; i < n-1; i++) {
for (int j = i + 1; j < n; j++) {
int x1 = points[i].first;
int y1 = points[i].second;
int x2 = points[j].first;
int y2 = points[j].second;
double dist = distance(x1, y1, x2, y2);
distances.push_back(dist);
}
}
sort(distances.begin(), distances.end());
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
int x1 = points[i].first;
int y1 = points[i].second;
int x2 = points[j].first;
int y2 = points[j].second;
int x3 = points[k].first;
int y3 = points[k].second;
double dist1 = distance(x1, y1, x2, y2);
double dist2 = distance(x1, y1, x3, y3);
double dist3 = distance(x2, y2, x3, y3);
// Find the index of the smallest two distances in the sorted distances array
int idx1 = lower_bound(distances.begin(), distances.end(), dist1) - distances.begin();
int idx2 = lower_bound(distances.begin(), distances.end(), dist2) - distances.begin();
int idx3 = lower_bound(distances.begin(), distances.end(), dist3) - distances.begin();
double area = triangleArea(x1, y1, x2, y2, x3, y3);
totalArea += area;
}
}
}
return totalArea;
} int main() { int n; cin>>n; vector<pair<int, int>> points(n); for(int i=0;i<n;i++) cin>>points[i].first>>points[i].second; double result=totalTriangleArea(points); cout<<fixed<<setprecision(1)<<result<<'\n'; return 0;
原文地址: https://www.cveoy.top/t/topic/h8o4 著作权归作者所有。请勿转载和采集!