swust oj 249 求凸包面積板子
分治求出凸點,累加每個三角形的面積得到最終答案。三角形面積等於叉積的一半。
程式碼如下:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#define sc scanf
#define pf printf
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const int N = 2e3 + 10;
PII node[N];
double ans = 0;
//判斷方向,1為正方向(逆時針),0為負方向。
int dir(PII a, PII b, PII c)
{
int x1 = b.first - a.first;
int y1 = b.second - a.second;
int x2 = c.first - a.first;
int y2 = c.second - a.second;
if(x1 * y2 - y1 * x2 > 0) return 1;
return 0;
}
//叉積求面機。
double getArea(PII a, PII b, PII c)
{
return fabs(0.5 * (a.first * b.second + b.first * c.second + c.first * a.second - a.first * c.second - b.first * a.second - c.first * b.second));
}
//累加三角形面積,其中 l 和 r 是左右兩個頂點。
void calc(int type, int l, int r)
{
int k = -1;
double temp_area = 0;
//在區間[l+1, r-1]之間找到第三個頂點。
for(int i = l + 1; i < r; i++) {
//方向不同則略過。
if(dir(node[l], node[i], node[r]) != type) continue;
double this_area = getArea(node[l], node[i], node[r]);
//更新當前最大面機。
if(temp_area - this_area < eps) {
temp_area = this_area;
k = i;
}
}
if(k == -1) return ;
ans += temp_area;
calc(type, l, k);
calc(type, k, r);
}
void solve()
{
ans = 0.0;
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> node[i].first >> node[i].second;
sort(node, node + n);
calc(1, 0, n - 1), calc(0, 0, n - 1);
cout << fixed << setprecision(1) << ans << endl;
}
int main()
{
#ifdef Yuew
freopen("in.txt", "r", stdin);
#endif //Yuew
int t; cin >> t; while(t--) solve();
return 0;
}
相關文章
- SWUST OJ:195: Buyer
- 面試板子面試
- Python 求圓的面積Python
- 求矩形周長與面積
- 兩圓相交求面積c++C++
- [unknown OJ] ZZH與揹包
- OJ-1011:圓柱體表面積、JavaJava
- SGU 277 Heroes(動態凸包維護)
- 字串板子字串
- kmp——板子~~~KMP
- dp板子
- 計算幾何(一):凸包問題(Convex Hull)
- 斜率優化(凸包優化)DP問題acm優化ACM
- 杭電OJ 2028求n個數的最小公倍數
- [USACO5.1] 圈奶牛Fencing the Cows /【模板】二維凸包
- P6810 「MCOI-02」Convex Hull 凸包 題解
- 圖論板子圖論
- 我的板子
- 高精板子
- 數論板子
- 利用定積分求極限
- 字串相乘——求字串的乘積字串
- oracle按列求乘積(轉)Oracle
- OJ搭建
- 轉發精品:求極限、求積分、求微分、求導數、求曲,求全微分、求複合求導
- 一些板子
- Latex 板子釋出
- 數論,但是板子
- 二分板子
- 最大島嶼面積
- 使用Egret外掛壓縮程式碼包體積,減少請求數量的實戰教程
- cad面積快捷鍵命令 cad測量不規則圖形面積
- BZOJ 1185 [HNOI2007]最小矩形覆蓋:凸包 + 旋轉卡殼
- Java的類和物件 圓柱體類求底面積和體積Java物件
- 馬拉車manacher板子
- 數位dp - 板子題
- PCL 計算點雲的面積和體積
- 【matplotlib 實戰】--面積圖