http://www.lydsy.com/JudgeOnline/problem.php?id=2178

题意:给出n<=1000个圆,求这些圆的面积并


#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <sstream>
using namespace std;
typedef long long ll;
#define pb push_back
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
inline int getint() { static int r, k; r=0,k=1; static char c; c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } const double eps=1e-6, PI=acos(-1);
int dcmp(double x) { return abs(x)<eps?0:(x<0?-1:1); }
double sqr(double x) { return x*x; }
struct iP { double x, y; iP(double _x=0, double _y=0) : x(_x), y(_y) {} };
double dis(iP &a, iP &b) { return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)); }
struct iC {
iP p; double r;
iP getP(double d) { return iP(p.x+cos(d)*r, p.y+sin(d)*r); }
double areaH(double d) { return (d-sin(d))/2*sqr(r); }
};
double angle(iP &a, iP &b) {
static double x, y;
x=b.x-a.x; y=b.y-a.y;
return atan2(y, x);
}
void CCi(iC &a, iC &b, double &ang1, double &ang2) {
static double ang, d, R, r, da;
d=dis(a.p, b.p); //dbg(d);
ang=angle(a.p, b.p);
R=a.r; r=b.r; //dbg((sqr(R)+sqr(d)-sqr(r))/2/R/d);
da=acos((sqr(R)+sqr(d)-sqr(r))/2/R/d);
ang1=ang-da;
ang2=ang+da;
} const int N=1105;
iC a[N];
int n, cnt;
bool nok[N];
struct dat { double pos; int k; }b[N*5];
bool cmp(const dat &a, const dat &b) { return a.pos<b.pos; } int main() {
read(n);
for1(i, 1, n) scanf("%lf%lf%lf", &a[i].p.x, &a[i].p.y, &a[i].r);
for1(i, 1, n) for1(j, 1, n) if(!nok[j] && i!=j) {
double d=dis(a[i].p, a[j].p);
if(dcmp(a[j].r-a[i].r-d)>=0) { nok[i]=1; break; }
}
double ang1, ang2, PI2=PI*2, ans=0;
int sum=0;
iP A, B;
for1(i, 1, n) if(!nok[i]) {
cnt=0;
for1(j, 1, n) if(i!=j && !nok[j]) {
if(dcmp(dis(a[i].p, a[j].p)-a[i].r-a[j].r)>=0) continue;
CCi(a[i], a[j], ang1, ang2);
if(dcmp(ang1)<0) ang1+=PI2;
if(dcmp(ang2)<0) ang2+=PI2;
if(dcmp(ang1-ang2)>0) {
++cnt; b[cnt].pos=0; b[cnt].k=1;
++cnt; b[cnt].pos=ang2; b[cnt].k=-1;
++cnt; b[cnt].pos=ang1; b[cnt].k=1;
++cnt; b[cnt].pos=PI2; b[cnt].k=-1;
}
else {
++cnt; b[cnt].pos=ang1; b[cnt].k=1;
++cnt; b[cnt].pos=ang2; b[cnt].k=-1;
}
}
++cnt; b[cnt].pos=0; b[cnt].k=0;
++cnt; b[cnt].pos=PI2; b[cnt].k=0;
sort(b+1, b+1+cnt, cmp);
sum=0;
for1(j, 1, cnt-1) {
sum+=b[j].k;
if(!sum) {
ans+=a[i].areaH(b[j+1].pos-b[j].pos);
A=a[i].getP(b[j].pos);
B=a[i].getP(b[j+1].pos);
ans+=(A.x*B.y-A.y*B.x)/2;
}
}
}
printf("%.3f\n", ans);
return 0;
}

这题坑了我3h啊啊啊啊啊.....................................................我就一sb...

这题有多种解法,什么是辛普森积分我不知道QAQ因此这种做法是一个坑....以后再填..

首先得知道如何求这些圆的并:

圆的面积并=每个圆没有被覆盖的弧(弦那里算起)的面积和+所有相交圆被覆盖弧所组成的多边形(由弦做边)

正确性自己画图.....

因此题目变为先求没有被覆盖的弧(直接离散圆周长为线,具体操作请看上上一题...),然后算出每个圆未被覆盖(就是覆盖弧的弦以外的)的面积,然后再用叉积求出多边形面积(原理就是多边形的面积可以通过加加减减得到...)

然后就完了

好题!

【BZOJ】2178: 圆的面积并的更多相关文章

  1. BZOJ 2178: 圆的面积并 [辛普森积分 区间并]

    2178: 圆的面积并 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1740  Solved: 450[Submit][Status][Discus ...

  2. [BZOJ 2178] 圆的面积并 【Simpson积分】

    题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13  2)要去掉被其他圆包含的圆. ...

  3. bzoj 2178 圆的面积并 —— 辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...

  4. bzoj 2178 圆的面积并——辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 把包含的圆去掉.横坐标不相交的一段一段圆分开算.算辛普森的时候预处理 f( ) ,比如 ...

  5. bzoj 2178 圆的面积并【simpson积分】

    直接套simpson,f可以直接把圆排序后扫一遍所有圆,这样维护一个区间就可以避免空段. 然而一定要去掉被其他圆完全覆盖的圆,否则会TLE #include<iostream> #incl ...

  6. BZOJ 2178 圆的面积并 ——Simpson积分

    [题目分析] 史上最良心样例,史上最难调样例. Simpson积分硬上. 听说用long double 精度1e-10才能过. 但是double+1e-6居然过了. [代码] #include < ...

  7. BZOJ 2178: 圆的面积并 (辛普森积分)

    code #include <set> #include <cmath> #include <cstdio> #include <cstring> #i ...

  8. 【BZOJ】【2178】圆的面积并

    自适应辛普森积分 Orz Hzwer 辛普森真是个强大的东西……很多东西都能积= = 这题的正解看上去很鬼畜,至少我这种不会计算几何的渣渣是写不出来……(对圆的交点求图包,ans=凸包的面积+一堆弓形 ...

  9. [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并

    [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...

随机推荐

  1. HDU2546(01背包饭卡)

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...

  2. HDU3345广搜 (P,E,T,#)

    War chess is hh's favorite game:In this game, there is an N * M battle map, and every player has his ...

  3. 【SpringMVC】SpringMVC系列12之数据类型转换、格式化、校验

      12.数据类型转换.格式化.校验 12.1.数据绑定流程     Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFacto ...

  4. eclipse debug source not fount

    1.选择Edit Source Lookup Path 2.选择Add 3.选择Java Project 4.选择相应的Project 进行OK确定即可 注意:做完以上的操作,要清除一下原来的断点,然 ...

  5. auto_ptr浅析(转载)

    转载自http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html auto_ptr是C++标准库中(<utility>)为 ...

  6. Java for LeetCode 173 Binary Search Tree Iterator

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  7. 6.python模块(导入,内置,自定义,开源)

    一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...

  8. 【数据结构】hanoi

    #include<stdio.h> void hanoi(int n,char x,char y,char z) { ; ) printf("%d. Move disk %d f ...

  9. COURSES(poj 1469)

    题意: 给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件: 1.每个学生选择一个不同的课程 2.每个课程都有不同的代表 如果满足,就输 ...

  10. redis 认证密码

    [root@cache01 ~]# grep "requirepass" /app/server/redis/conf/6379.conf # If the master is p ...