热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bzoj2618凸多边形半平面交

链接:http:www.lydsy.comJudgeOnlineproblem.php?id2618题意:求出几个封闭图形围成的内部区域面积。把每一条边作为有向直线,逆时针遍历全图,左侧的半

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2618

题意:求出几个封闭图形围成的内部区域面积。

把每一条边作为有向直线,逆时针遍历全图,左侧的半平面交

 1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std;
7 int n,cnt;
8 const int maxn=55;
9 struct point
10 {
11 double x,y;
12 }p[maxn],a[maxn*maxn];
13 double operator *(const point &a,const point &b)
14 {
15 return a.x*b.y-a.y*b.x;
16 }
17 point operator -(const point &a,const point &b)
18 {
19 return (point){a.x-b.x,a.y-b.y};
20 }
21 struct line
22 {
23 point a,b;double slop;
24 friend bool operator <(const line &a,const line &b)
25 {
26 if(a.slop!=b.slop)return a.slop<b.slop;
27 return (b.b-a.a)*(a.b-a.a)<0;
28 }
29 void print()
30 {
31 printf("%lf %lf %lf %lf\n",a.x,a.y,b.x,b.y);
32 }
33 }l[maxn*maxn],q[maxn*maxn];
34 void pre()
35 {
36 for(int i=1;i<=cnt;i++)l[i].slop=atan2(l[i].b.y-l[i].a.y,l[i].b.x-l[i].a.x);
37 sort(l+1,l+cnt+1);int tot=0;
38 for(int i=1;i<=cnt;i++)
39 {
40 if(l[i].slop!=l[i-1].slop)tot++;
41 l[tot]=l[i];
42 }
43 cnt=tot;
44 }
45 point inter(line a,line b)
46 {
47 double k1,k2;
48 k1=(a.a-b.a)*(a.a-b.b),k2=(a.b-b.b)*(a.b-b.a);
49 k1=k1/(k1+k2);
50 point ans;
51 ans.x=a.a.x+k1*(a.b.x-a.a.x),ans.y=a.a.y+k1*(a.b.y-a.a.y);
52 return ans;
53 }
54 bool judge(point a,line b)
55 {
56 return (b.a-a)*(b.b-a)<0;
57 }
58 void work()
59 {
60 int L=1,R=0;
61 q[++R]=l[1],q[++R]=l[2];
62 for(int i=3;i<=cnt;i++)
63 {
64 while(L1]),l[i]))R--;
65 while(L1]),l[i]))L++;
66 q[++R]=l[i];
67 }
68 while(L1]),q[L]))R--;
69 cnt=0;
70 for(int i=L;i1]);
71 a[++cnt]=inter(q[R],q[L]);
72 }
73 void getans()
74 {
75 double ans=0;
76 for(int i=1;i1];
77 ans+=a[cnt]*a[1];
78 ans=fabs(ans/2.0);
79 printf("%0.3lf",ans);
80 }
81 int haha()
82 {
83 scanf("%d",&n);
84 for(int i=1;i<=n;i++)
85 {
86 int m;scanf("%d",&m);
87 for(int j=1;j<=m;j++)
88 {
89 scanf("%lf%lf",&p[j].x,&p[j].y);
90 if(j==1)continue;
91 l[++cnt].a=p[j-1];l[cnt].b=p[j];
92 }
93 l[++cnt].a=p[m];l[cnt].b=p[1];
94 }
95 pre();work();getans();
96 }
97 int sb=haha();
98 int main(){;}
bzoj2618

 

就是所求的结果。


推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
author-avatar
手机用户2602925875
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有