[CQOI2005]三角形面积并

题目大意:

求\(n(n\le100)\)个三角形的面积并。

思路:

自适应辛普森法,玄学卡精度可过。

源代码:

#include<cmath>
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=101;
const double eps=1e-10;
struct Point {
double x,y;
};
struct Triangle {
Point p1,p2,p3;
};
Triangle t[N];
struct Node {
double p;
int v,id;
bool operator < (const Node &rhs) const {
return p<rhs.p;
}
};
std::vector<Node> v;
std::vector<int> c;
inline bool cross(const Point &a,const Point &b,const double &x) {
if(a.x==b.x) return false;
if(a.x<b.x) {
return a.x<=x&&x<b.x;
} else {
return b.x<x&&x<=a.x;
}
}
inline double calc(const Point &a,const Point &b,const double &x) {
return (b.y-a.y)/(b.x-a.x)*(x-a.x)+a.y;
}
inline double F(const double &x) {
std::vector<std::pair<double,int> > v;
for(register unsigned j=0;j<c.size();j++) {
const int &i=c[j];
double q[3];
int h=0;
if(cross(t[i].p1,t[i].p2,x)) {
q[h++]=calc(t[i].p1,t[i].p2,x);
}
if(cross(t[i].p2,t[i].p3,x)) {
q[h++]=calc(t[i].p2,t[i].p3,x);
}
if(cross(t[i].p3,t[i].p1,x)) {
q[h++]=calc(t[i].p3,t[i].p1,x);
}
if(h==2) {
if(q[0]>q[1]) std::swap(q[0],q[1]);
v.push_back(std::make_pair(q[0],1));
v.push_back(std::make_pair(q[1],-1));
}
}
std::sort(v.begin(),v.end());
double st,ans=0;
for(register unsigned i=0,tmp=0;i<v.size();i++) {
if(tmp==0) st=v[i].first;
tmp+=v[i].second;
if(tmp==0) {
ans+=v[i].first-st;
}
}
return ans;
}
inline double simpson(const double &fl,const double &fm,const double &fr,const double &len) {
return (fl+4*fm+fr)*len/6;
}
inline double asr(const double &a,const double &b,const double &fl,const double &fm,const double &fr,const int &d) {
const double c=(a+b)/2;
const double flm=F((a+c)/2),frm=F((c+b)/2);
const double ls=simpson(fl,flm,fm,c-a),rs=simpson(fm,frm,fr,b-c),s=simpson(fl,fm,fr,b-a);
if(fabs(ls+rs-s)<eps&&d>13) return ls+rs;
return asr(a,c,fl,flm,fm,d+1)+asr(c,b,fm,frm,fr,d+1);
}
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
scanf("%lf%lf%lf%lf%lf%lf",&t[i].p1.x,&t[i].p1.y,&t[i].p2.x,&t[i].p2.y,&t[i].p3.x,&t[i].p3.y);
v.push_back((Node){std::min(std::min(t[i].p1.x,t[i].p2.x),t[i].p3.x),1,i});
v.push_back((Node){std::max(std::max(t[i].p1.x,t[i].p2.x),t[i].p3.x),-1,i});
}
std::sort(v.begin(),v.end());
int tmp=0,beg;
double ans=0;
for(register unsigned i=0;i<v.size();i++) {
if(tmp==0) beg=i;
tmp+=v[i].v;
if(tmp==0) {
for(register unsigned j=beg;j<=i;j++) {
c.push_back(v[j].id);
}
std::sort(c.begin(),c.end());
c.resize(std::unique(c.begin(),c.end())-c.begin());
const double &st=v[beg].p,&en=v[i].p;
ans+=asr(st,en,F(st),F((st+en)/2),F(en),1);
c.clear();
}
}
printf("%.2f\n",ans);
return 0;
}

[CQOI2005]三角形面积并的更多相关文章

  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. 【BZOJ1845】[Cqoi2005] 三角形面积并 几何+扫描线

    [BZOJ1845][Cqoi2005] 三角形面积并 Description 给出n个三角形,求它们并的面积. Input 第一行为n(N < = 100), 即三角形的个数 以下n行,每行6 ...

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

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

  5. BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1845 题意概括 给出n个三角形,求其面积并. 题解 有一个很经典的扫描线题目:矩形面积并.那个比较 ...

  6. BZOJ1845 : [Cqoi2005] 三角形面积并

    求出所有交点后从左往右扫描线,用每段的中位线去截所有三角形,算出长度并后乘以该段长度即可,时间复杂度$O(n^3\log n)$. #include<cstdio> #include< ...

  7. BZOJ 1845: [Cqoi2005] 三角形面积并 (辛普森积分)

    大力辛普森积分 精度什么的搞了我好久- 学到了Simpson的一个trick 深度开11,eps开1e-4.跑的比有些扫描线还快- CODE #include <bits/stdc++.h> ...

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

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

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

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

随机推荐

  1. 论文阅读笔记十五:Pyramid Scene Parsing Network(CVPR2016)

    论文源址:https://arxiv.org/pdf/1612.01105.pdf tensorflow代码:https://github.com/hellochick/PSPNet-tensorfl ...

  2. java.io几种读写文件的方式

    一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作 ...

  3. fetch请求

    get请求 return fetch('https://xxx.xxx.com/xxx.json') .then(response => response.json()) .then(respo ...

  4. GoogleTest入门

    Googletest入门 来源:https://github.com/google/googletest/blob/master/googletest/docs/primer.md P.S. gmoc ...

  5. python requests 正则爬虫

    代码: import requests from multiprocessing import Pool from requests.exceptions import RequestExceptio ...

  6. Linux发布WebApi

    一:WebApi 使用Owin来做  http://www.cnblogs.com/xiaoyaodijun/category/666029.html 二:安装最新版的Jexus服务 https:// ...

  7. 提高VS项目的压缩文件大小

    对于.NET项目,如果将编译方式由Debug改为Release,使用压缩软件压缩项目文件时可以大大减少压缩文件的大小,具体原因待查.

  8. Java中堆内存和栈内存的区别

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空 ...

  9. System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常

    在学习EF code First的小案例的时候,遇见了这个异常 <configSections> <!-- For more information on Entity Framew ...

  10. urllib设置debuglevel打开调试开关

    1. 参考 Turning on debug output for python 3 urllib https://bugs.python.org/issue26892 Python爬虫入门四之Url ...