BZOJ 1845三角形面积并
题目链接: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三角形面积并的更多相关文章
- bzoj 1845: [Cqoi2005] 三角形面积并 扫描线
1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 848 Solved: 206[Submit][Statu ...
- BZOJ 1845: [Cqoi2005] 三角形面积并 [计算几何 扫描线]
1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1151 Solved: 313[Submit][Stat ...
- CQOI2005 三角形面积并 和 POJ1177 Picture
1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1664 Solved: 443[Submit][Stat ...
- ytu 1058: 三角形面积(带参的宏 练习)
1058: 三角形面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 190 Solved: 128[Submit][Status][Web Boar ...
- UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)
Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...
- OpenJudge计算概论-计算三角形面积【海伦公式】
/*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...
- nyoj 67 三角形面积【三角形面积公式】
三角形面积 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入 每行是一组测试数据,有6个 ...
- NYOJ 67 三角形面积(线代,数学)
三角形面积 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入 每行是一组测试数据,有6个 ...
- TZOJ 2519 Regetni(N个点求三角形面积为整数总数)
描述 Background Hello Earthling. We're from the planet Regetni and need your help to make lots of mone ...
随机推荐
- 富文本编辑器layedit,调用setContent方法会报错
需要把layedit.js里的setContent 函数的 layedit.sync(index)); 改成 this.sync(index));
- CentOS7.6 yum install Git
1. yum install git 2. git version or git –version 3. uninstall: git remove
- 『PyTorch』第十一弹_torch.optim优化器
一.简化前馈网络LeNet import torch as t class LeNet(t.nn.Module): def __init__(self): super(LeNet, self).__i ...
- 『cs231n』神经网络组件
- hdu3068 manacher模板题
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为 ...
- python-day21--序列化模块模块
什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化 序列化的目的: 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. ...
- logback 范例
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...
- Activiti工作流笔记(2)
1.Activiti工作数据表 Activiti用来存放流程数据的表共使用23张表,表名都是以"ACT_"开头,底层操作默认使用mybatis操作 工作流Activiti的表是用来 ...
- 使用 PM2 管理nodejs进程
pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...
- mysql创建索引-----高性能(五)
转载地址:https://www.cnblogs.com/llzhang123/p/7889382.html 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或 ...