BZOJ 1845三角形面积并
来源:互联网 发布:淘宝黑搜索卡首页2017 编辑:程序博客网 时间:2024/06/05 01:19
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1845
给定100个三角形,求三角形面积并。
戴神模板太可怕,直接调用函数秒掉,思路有点繁琐,不大清楚,贴一个代码。
代码:
/* ***********************************************Author :rabbitCreated Time :2014/7/3 22:46:38File Name :2.cpp************************************************ */#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <iostream>#include <algorithm>#include <sstream>#include <stdlib.h>#include <string.h>#include <limits.h>#include <string>#include <time.h>#include <math.h>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define INF 0x3f3f3f3f#define eps 1e-8#define pi acos(-1.0)typedef long long ll;int dcmp(double x){if(fabs(x)<eps)return 0;return x>0?1:-1;}struct Point{double x,y;Point(double _x=0,double _y=0){x=_x;y=_y;}};Point operator + (Point a,Point b){return Point(a.x+b.x,a.y+b.y);}Point operator - (Point a, Point b){return Point(a.x-b.x,a.y-b.y);}Point operator * (Point a,double p){return Point(a.x*p,a.y*p);}Point operator / (Point a,double p){return Point(a.x/p,a.y/p);}bool operator < (const Point &a,const Point &b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}bool operator == (const Point &a,const Point &b){return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;}double Dot(Point a, Point b){return a.x*b.x+a.y*b.y;}double Length(Point a){return sqrt(Dot(a,a));}double Angle(Point a,Point b){return acos(Dot(a,b)/Length(a)/Length(b));}double angle(Point a){return atan2(a.y,a.x);}double Cross(Point a,Point b){return a.x*b.y-a.y*b.x;}Point GetLineIntersection(Point p,Point v,Point q,Point w){Point u=p-q;double t=Cross(w,u)/Cross(v,w);return p+v*t;}struct polygon{int n;Point p[100];double getarea(){double sum=0;for(int i=0;i<n;i++){sum+=Cross(p[i],p[(i+1)%n]);}return fabs(sum)/2;}bool getdir(){double sum=0;for(int i=0;i<n;i++)sum+=Cross(p[i],p[(i+1)%n]);if(dcmp(sum)>0)return 1;return 0;}};struct polygons{vector<polygon> p;polygons(){p.clear();}void push(polygon q){if(dcmp(q.getarea()))p.push_back(q);}vector<pair<double,int> > e;void ins(Point s,Point t,Point X,int i){double r=fabs(t.x-s.x)>eps?(X.x-s.x)/(t.x-s.x):(X.y-s.y)/(t.y-s.y);r=min(r,1.0);r=max(r,0.0);e.push_back(make_pair(r,i));}double polyareaunion(){double ans=0;int c0,c1,c2;for(int i=0;i<p.size();i++)if(p[i].getdir()==0)reverse(p[i].p,p[i].p+p[i].n);for(int i=0;i<p.size();i++){for(int k=0;k<p[i].n;k++){Point &s=p[i].p[k],&t=p[i].p[(k+1)%p[i].n];if(!dcmp(Cross(s,t)))continue;e.clear();e.push_back(make_pair(0.0,1));e.push_back(make_pair(1.0,-1));for(int j=0;j<p.size();j++)if(i!=j){for(int w=0;w<p[j].n;w++){Point a=p[j].p[w];Point b=p[j].p[(w+1)%p[j].n];Point c=p[j].p[(w-1+p[j].n)%p[j].n];c0=dcmp(Cross(t-s,c-s));c1=dcmp(Cross(t-s,a-s));c2=dcmp(Cross(t-s,b-s));if(c1*c2<0)ins(s,t,GetLineIntersection(s,t-s,a,b-a),-c2);else if(!c1&&c0*c2<0)ins(s,t,a,-c2);else if(!c1&&!c2){int c3=dcmp(Cross(t-s,p[j].p[(w+2)%p[j].n]-s));int dp=dcmp(Dot(t-s,b-a));if(dp&&c0)ins(s,t,a,dp>0?c0*((j>i)^(c0<0)):-(c0<0));if(dp&&c3)ins(s,t,b,dp>0?-c3*((j>i)^(c3<0)):c3<0);}}}sort(e.begin(),e.end());int ct=0;double tot=0,last;for(int j=0;j<e.size();j++){if(ct==1)tot+=e[j].first-last;ct+=e[j].second;last=e[j].first;}ans+=Cross(s,t)*tot;}}return fabs(ans)/2;}};int main(){ //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n; while(~scanf("%d",&n)){ polygons ps; double ans=0; for(int i=0;i<n;i++){ polygon p1; p1.n=3; for(int j=0;j<p1.n;j++){ scanf("%lf%lf",&p1.p[j].x,&p1.p[j].y); } ps.push(p1); } printf("%.2f\n",ps.polyareaunion()); } return 0;}
0 0
- BZOJ 1845三角形面积并
- bzoj-1845 三角形面积并
- BZOJ 1845 Cqoi2005 三角形面积并 扫描线
- BZOJ 1845 CQOI 2005 三角形面积并 扫描线
- BZOJ 1845 [Cqoi2005] 三角形面积并 计算几何扫描线
- [扫描线 计算几何] BZOJ 1845 [Cqoi2005] 三角形面积并
- bzoj 1845: [Cqoi2005] 三角形面积并(计算几何)
- bzoj 1845: [Cqoi2005] 三角形面积并 (扫描线+计算几何)
- bzoj1845【CQOI2005】三角形面积并
- bzoj1845: [Cqoi2005] 三角形面积并
- 输入三角形边长,并计算面积
- 计算并输出三角形的面积
- 3-10(判断三角形并输出面积)
- bzoj1845 三角形面积并 计算几何
- c++判断并求三角形面积
- 5.3判断并计算三角形的面积
- 判断一个三角形并求面积
- 计算三角形的面积,并判断三角形的类型?
- cocos2d-x中通过Jni实现Java与C++的互相调用-------------------cocos2d-x-3.0正式版本(7.3)
- Cocos2d-x 3.0游戏开发找小三之搭建开发环境
- 【剑指offer】Q38:数字在数组中出现的次数
- HDU 2829 Lawrence
- POJ 3666 Making the Grade [DP]
- BZOJ 1845三角形面积并
- java Logger
- Android文件上传,支持多文件同时上传
- vs 预先生成事件命令行 用法
- Hibernate中新增数据出错
- 在.NET里简易实现IoC
- [leetcode 9] Palindrome Number
- 任意输入10个数字,以从小到大输出,并求他们的平均值
- UITableView编辑