2015 HIAST Collegiate Programming Contest J
Polygons Intersection
题意:给2个凸多边形,求相交面积
思路:不会,套板子就是了
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8; const int N=1e5+100;///2015 HIAST Collegiate Programming Contest///JJJJ#define maxn 510 const double eps=1E-8; int sig(double d){return(d>eps)-(d<-eps); } struct Point{double x,y; Point(){}Point(double x,double y):x(x),y(y){}bool operator==(const Point&p)const{return sig(x-p.x)==0&&sig(y-p.y)==0;} }; double cross(Point o,Point a,Point b){return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y); } double area(Point* ps,int n){ps[n]=ps[0];double res=0;for(int i=0;i<n;i++){res+=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;}return res/2.0; } int lineCross(Point a,Point b,Point c,Point d,Point&p){double s1,s2;s1=cross(a,b,c);s2=cross(a,b,d);if(sig(s1)==0&&sig(s2)==0) return 2;if(sig(s2-s1)==0) return 0;p.x=(c.x*s2-d.x*s1)/(s2-s1);p.y=(c.y*s2-d.y*s1)/(s2-s1);return 1; } //多边形切割 //用直线ab切割多边形p,切割后的在向量(a,b)的左侧,并原地保存切割结果 //如果退化为一个点,也会返回去,此时n为1 void polygon_cut(Point*p,int&n,Point a,Point b){static Point pp[maxn];int m=0;p[n]=p[0];for(int i=0;i<n;i++){if(sig(cross(a,b,p[i]))>0) pp[m++]=p[i];if(sig(cross(a,b,p[i]))!=sig(cross(a,b,p[i+1])))lineCross(a,b,p[i],p[i+1],pp[m++]);}n=0;for(int i=0;i<m;i++)if(!i||!(pp[i]==pp[i-1]))p[n++]=pp[i];while(n>1&&p[n-1]==p[0])n--; } //---------------华丽的分隔线-----------------// //返回三角形oab和三角形ocd的有向交面积,o是原点// double intersectArea(Point a,Point b,Point c,Point d){Point o(0,0);int s1=sig(cross(o,a,b));int s2=sig(cross(o,c,d));if(s1==0||s2==0)return 0.0;//退化,面积为0if(s1==-1) swap(a,b);if(s2==-1) swap(c,d);Point p[10]={o,a,b};int n=3;polygon_cut(p,n,o,c);polygon_cut(p,n,c,d);polygon_cut(p,n,d,o);double res=fabs(area(p,n));if(s1*s2==-1) res=-res;return res; } //求两多边形的交面积 double intersectArea(Point*ps1,int n1,Point*ps2,int n2){if(area(ps1,n1)<0) reverse(ps1,ps1+n1);if(area(ps2,n2)<0) reverse(ps2,ps2+n2);ps1[n1]=ps1[0];ps2[n2]=ps2[0];double res=0;for(int i=0;i<n1;i++){for(int j=0;j<n2;j++){res+=intersectArea(ps1[i],ps1[i+1],ps2[j],ps2[j+1]);}}return res;//assumeresispositive! } //hdu-3060求两个任意简单多边形的并面积 Point ps1[maxn],ps2[maxn]; int n1,n2; int main(){int t;cin>>t;while(t--){scanf("%d%d",&n1,&n2);for(int i=0;i<n1;i++)scanf("%lf%lf",&ps1[i].x,&ps1[i].y);for(int i=0;i<n2;i++)scanf("%lf%lf",&ps2[i].x,&ps2[i].y);double ans=intersectArea(ps1,n1,ps2,n2);//ans=fabs(area(ps1,n1))+fabs(area(ps2,n2))-ans;//容斥printf("%.4f\n",ans);}return 0; }
转载于:https://www.cnblogs.com/max88888888/p/7162620.html
2015 HIAST Collegiate Programming Contest J相关推荐
- 2015 German Collegiate Programming Contest (GCPC 15)
2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...
- 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
A (By ggg): 题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄 灯,r秒红灯,问你到红绿灯的时候是什么灯.值得注意的是绿 灯变黄灯时,第g秒是黄灯了. B (By Anxdada) ...
- 2022 Jiangsu Collegiate Programming Contest - J. Balanced Tree
L. Collecting Diamonds 题目描述 A binary tree T is called super balanced if T is empty or satisfies the ...
- 2015 ACM Arabella Collegiate Programming Contest(F题)
F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...
- (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...
- 2018 German Collegiate Programming Contest (GCPC 18)
2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...
- 2016 China Collegiate Programming Contest Final
2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...
- 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey
题目描述 [题目链接](https://codeforces.com/gym/102220/problem/I) 给定长度为 $n$ 的 $a$ 序列,保证 $a_n \le n$,求有多少个长度为 ...
最新文章
- LLVM IR 理解
- tomcat 修改默认访问根目录
- 前端性能测试详细分析(二)
- 用js实现分享到随页面滚动而滑动效果
- 2019-03-12-算法-进化(合并两个有序数组)
- IDEA里如何安装Python插件打造开发环境(图文详解)
- 南京信息工程大学c语言期末答案,南京信息工程大学试卷2011-2012(2)c语言程序设计试卷答案(文科)-a...
- 【Elasticsearch】7.9 单字段支持的最大字符数
- leetcode求众数
- python和json转换_python和json之间转化
- 卷积神经网络之迁移学习
- [HEOI2014]大工程
- java小游戏制作(maxfo)
- 【牛客网】滴滴出行2017秋招测试岗笔试真题汇总
- 将几个常用网站页面保存为PDF并删除网页无用部分
- 智慧路灯物联网解决方案
- linux7重置密码,centos7重置密码
- 《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)
- 影响中国青年的100句人生名言 1
- 【屏类型结构体定义PanelType】 文档位置:《apiPNL.h》