BZOJ1845CQOI2005三角形面积并

1845: [Cqoi2005] 三角形面积并

Description

给出n个三角形,求它们并的面积。

Input

第一行为n(N < = 100), 即三角形的个数 以下n行,每行6个整数x1, y1, x2, y2, x3, y3,代表三角形的顶点坐标。坐标均为不超过10 ^ 6的实数,输入数据保留1位小数

Output

输出并的面积u, 保留两位小数

Sample Input

2

0.0 0.0 2.0 0.0 1.0 1.0

1.0 0.0 3.0 0.0 2.0 1.0

Sample Output

1.75

这道题是扫描线,第二点还卡精度,不过按照我的写法精度没问题。

思路简单,每条线求交点,过交点作y轴的平行线,切过去。

由于如果该点原本就是三角形的顶点,就会加入两个点到截线中,可以求相邻的截线的中位线,方便很多。

我看见网上很多程序都写了一堆operator,但是我没写还是过了OK!

好久没写码农题了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int N=110;
 7 const int eps=1e-8;
 8 double x[9*N*N/2+3*N],y[3*N];
 9 bool re[9*N*N/2+3*N];
10 struct node{
11     double l,r,k,b;
12     bool upst;
13 }line[3*N];
14 struct node1{
15     double y;
16     int gr;
17 };
18 int sl=0,sp=0;
19 inline void addline(int a,int b)
20 {
21     sl++;
22     line[sl].l=min(x[a],x[b]);
23     line[sl].r=max(x[a],x[b]);
24     if(x[a]==x[b])
25     {
26         line[sl].upst=1;
27         return;
28     }
29     line[sl].k=(y[b]-y[a])/(x[b]-x[a]);
30     line[sl].b=y[a]-line[sl].k*x[a];
31 }
32 inline void addpoint(int a,int b)
33 {
34     double X;
35     if(line[a].upst&&line[b].upst) return;
36     else if(line[a].upst) X=line[a].l;
37     else if(line[b].upst) X=line[b].l;
38     else X=(line[b].b-line[a].b)/(line[a].k-line[b].k);
39     if(max(line[a].l,line[b].l)<X&&X<min(line[a].r,line[b].r)) x[++sp]=X;
40 }
41 inline bool cmp(node1 u,node1 v) {return u.y<v.y;}
42 inline double cal(double x)
43 {
44     double res=0,la;
45     node1 cut[3*N];
46     int sz=0,cnt=0;
47     bool used[N],flag=true;
48     memset(used,0,sizeof(used));
49     for(int i=1;i<=sl;i++) if(line[i].l<=x&&x<=line[i].r)
50     {
51         cut[++sz].y=x*line[i].k+line[i].b;
52         cut[sz].gr=i/3;
53         if(i%3!=0) cut[sz].gr++;
54     }
55     sort(cut+1,cut+sz+1,cmp);
56     for(int i=1;i<=sz;i++)
57     {
58         if(used[cut[i].gr]) cnt--;
59         else
60         {
61             if(cnt==0) la=cut[i].y;
62             cnt++;
63         }
64         used[cut[i].gr]^=1;
65         if(cnt==0) res+=cut[i].y-la;
66     }
67     return res;
68 }
69 int main()
70 {
71     int n;
72     scanf("%d",&n);
73     sp=3*n;
74     for(int i=1;i<=n;i++)
75     {
76         for(int j=-2;j<=0;j++) scanf("%lf%lf",&x[i*3+j],&y[i*3+j]);
77         addline(3*i-2,3*i-1);
78         addline(3*i-1,3*i);
79         addline(3*i,3*i-2);
80     }
81     for(int i=1;i<sl;i++)
82         for(int j=i+1;j<=sl;j++) addpoint(i,j);
83     sort(x+1,x+sp+1);
84     double last=0.1410392,now,ans=0,lx;
85     for(int i=1;i<=sp;i++)
86     {
87         if(x[i]==last) re[i]=1;
88         else last=x[i];
89     }
90     lx=x[1];
91     for(int i=2;i<=sp;i++) if(!re[i])
92     {
93         ans+=(x[i]-lx)*cal((x[i]+lx)/2);
94         lx=x[i];
95     }
96     printf("%.2lf\n",ans-eps);
97     return 0;
98 }
时间: 2024-10-07 00:59:19

BZOJ1845CQOI2005三角形面积并的相关文章

叉乘、快速排斥与跨立实验及求取三角形面积

<pre name="code" class="cpp">叉乘 (一)判断方向 (二)判断线段相交 (三)求三角形面积 (一)判断方向 叉乘的性质如下: (1). P x Q > 0; 表示P在Q的顺时针方向; (2). p x Q < 0; 表示P在Q的逆时针方向; (3). P x Q = 0; 表示P和Q是共线的 P(x1,y1),Q(x2,y2), P*Q=x1y2-x2y1 判断结果三种状态 模版为: struct point {

BZOJ 1845: [Cqoi2005] 三角形面积并 [计算几何 扫描线]

1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1151  Solved: 313[Submit][Status][Discuss] Description 给出n个三角形,求它们并的面积. Input 第一行为n(N < = 100), 即三角形的个数 以下n行,每行6个整数x1, y1, x2, y2, x3, y3,代表三角形的顶点坐标.坐标均为不超过10 ^ 6的实数,输入数据保留1位小数 Out

三角形面积

如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何多余内容或说明性文字.

三角形面积(海伦公式)

来自:http://www.oschina.net/code/snippet_149523_14180 描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入 每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示三个点的横纵坐标.(坐标值都在0到10000之间)输入0 0 0 0 0 0表示输入结束测试数据不超过10000组 输出 输出这三个点所代表的三角形的面积,结果精确到小数点后1位(即使是整数也要输出一位小数位) 样例输入 0 0 1 1 1

bzoj 1845: [Cqoi2005] 三角形面积并 扫描线

1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 848  Solved: 206[Submit][Status][Discuss] Description 给出n个三角形,求它们并的面积. Input 第一行为n(N < = 100), 即三角形的个数 以下n行,每行6个整数x1, y1, x2, y2, x3, y3,代表三角形的顶点坐标.坐标均为不超过10 ^ 6的实数,输入数据保留1位小数 Outp

rwkj 1363 正方形 长方形 三角形面积

C++:重载函数2(计算面积)时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:370 测试通过:241 描述 定义重载函数area(),分别计算正方形.长方形和三角形的面积. 输入 共计有3行. 第1行有一个实数,为正方形的边长: 第2行有二个实数,为长方形的两条边长: 第3行有三个实数,为三角形的三边长. 输出 正方形.长方形和三角形的面积(保留3位小数). 样例输入 3.54.2 5.623.0 4.0 5.0 样例输出 12.25023.6

Java入门:基础算法之计算三角形面积

本部分介绍如何计算三角形面积. /** * @author: 理工云课堂 * @description: 程序计算三角形的面积.三角形的底和高由用户输入 */ import java.util.Scanner; class AreaTriangleDemo { public static void main(String args[]) { Scanner scanner = new Scanner(System.in); System.out.println("Enter the width

nyist 67三角形面积

三角形面积时间限制:3000 ms | 内存限制:65535 KB 难度:2描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积输入每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示三个点的横纵坐标.(坐标值都在0到10000之间)输入0 0 0 0 0 0表示输入结束测试数据不超过10000组输出输出这三个点所代表的三角形的面积,结果精确到小数点后1位(即使是整数也要输出一位小数位)样例输入0 0 1 1 1 30 1 1 0 0 00 0 0 0

POJ2826 An Easy Problem?!(线段交点,三角形面积)

题目链接: http://poj.org/problem?id=2826 题目描述: An Easy Problem?! Description It's raining outside. Farmer Johnson's bull Ben wants some rain to water his flowers. Ben nails two wooden boards on the wall of his barn. Shown in the pictures below, the two b