题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1845

给定100个三角形,求三角形面积并。

戴神模板太可怕。直接调用函数秒掉。思路有点繁琐,不大清楚。贴一个代码。

代码:

/* ***********************************************
Author :rabbit
Created Time :2014/7/3 22:46:38
File 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;
}

BZOJ 1845三角形面积并的更多相关文章

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

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 848  Solved: 206[Submit][Statu ...

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

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1151  Solved: 313[Submit][Stat ...

  3. CQOI2005 三角形面积并 和 POJ1177 Picture

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1664  Solved: 443[Submit][Stat ...

  4. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

  5. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)

    Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...

  6. OpenJudge计算概论-计算三角形面积【海伦公式】

    /*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...

  7. nyoj 67 三角形面积【三角形面积公式】

    三角形面积 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积   输入 每行是一组测试数据,有6个 ...

  8. NYOJ 67 三角形面积(线代,数学)

    三角形面积 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积   输入 每行是一组测试数据,有6个 ...

  9. TZOJ 2519 Regetni(N个点求三角形面积为整数总数)

    描述 Background Hello Earthling. We're from the planet Regetni and need your help to make lots of mone ...

随机推荐

  1. splice的多种用法

    (一)splice的多种用法: splice(n,m) 从索引n开始删除m个.返回删除项组成新数组 splice(n) 从索引n开始删除到末尾 splice(n,m,x) 从索引n开始删除m个,并且把 ...

  2. python-day14--带参数的装饰器+多个装饰器装饰同一个函数

    1.# 带参数的装饰器def f1(flag): def f2(func): def inner(*args,**kwargs): if flag: '''执行函数之前要做的''' r=func(*a ...

  3. UVA-10689 Yet another Number Sequence (矩阵二分幂模板)

    题目大意:已知递推公式和边缘值,求某项的最后m(0<m<5)位数字. 题目分析:矩阵二分幂的模板题. 代码如下: # include<iostream> # include&l ...

  4. javaScript面向对象是什么?(一)

    js就是个面向对象语言,一切皆对象 一.什么是面向对象? 简单点,就这么说吧.生活中有一些个物品,譬如(哈哈,还想起个譬如)说一个iPhone,我们也不知道里面的工作原理吧?但是咱们会按按钮呀,用一俩 ...

  5. 李阳音标速成MP3文本

    第一节:前元音 No. 1 [i:]穿针引线长衣音,简称"长衣音" 字母:e字母:ee 字母:ea字母:ie字母:ei 其发音要领是发音时舌尖抵下齿,前舌尽量抬高.舌位高于/i/: ...

  6. vs2015如何设置类或函数前不显示引用的数量

    这几天,从vs2012换成vs2015,感觉15版本增加了一个类或函数前提示引用的数量,这个感觉很别扭,如何取消显示这个呢? 问题如下: 取消显示这个引用的步骤: 找到菜单栏: 工具 ---> ...

  7. scrapy-redis(七):部署scrapy

    一般我们写好scrapy爬虫,如果需要启动的话,需要进入scrapy项目的根目录,然后运行以下命令: scrapy crawl {spidername} 这样我们就可以在终端查看到爬虫信息了.但爬虫运 ...

  8. C#:String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}...

    int a = 12345678; //格式为sring输出//   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a);// ...

  9. QT环境下实现UI界面的“拼图游戏”

    main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *ar ...

  10. C++11标准的类型别名

    1.typedef 类型名  类型别名(类型别名列表):这是传统的C++类型别名声明. 2.C++11标准下,使用using,即using 类型别名=类型名.