【BZOJ】【2178】圆的面积并
自适应辛普森积分
Orz Hzwer
辛普森真是个强大的东西……很多东西都能积= =
这题的正解看上去很鬼畜,至少我这种不会计算几何的渣渣是写不出来……(对圆的交点求图包,ans=凸包的面积+一堆弓形的面积,另外还有中空的情况……那种凸包怎么求啊喂!)
/**************************************************************
Problem: 2178
User: Tunix
Language: C++
Result: Accepted
Time:8808 ms
Memory:1372 kb
****************************************************************/ //BZOJ 2178
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
const double eps=1e-;
typedef long long LL;
typedef double db;
/******************tamplate*********************/
int n,top,st,ed;
db xl[N],xr[N],ans;
bool del[N];
struct data{db x,y,r;}t[N],sk[N];
struct line{db l,r;}p[N];
db dis(data a,data b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp1(data a,data b){return a.r<b.r;}
bool cmp2(data a,data b){return a.x-a.r<b.x-b.r;}
bool cmp3(line a,line b){return a.l<b.l;}
void init(){
scanf("%d",&n);
F(i,,n) scanf("%lf%lf%lf",&t[i].x,&t[i].y,&t[i].r);
sort(t+,t+n+,cmp1);
F(i,,n) F(j,i+,n)
if(dis(t[i],t[j])<=t[j].r-t[i].r){
del[i]=; break;
}
F(i,,n)if(!del[i]) sk[++top]=t[i];n=top;
sort(sk+,sk+n+,cmp2);
}
db getf(db x){
int j,sz=; db r,len=,dis;
F(i,st,ed){
if (x<=xl[i]||x>=xr[i])continue;
dis=sqrt(sk[i].r-(x-sk[i].x)*(x-sk[i].x));
p[++sz].l=sk[i].y-dis; p[sz].r=sk[i].y+dis;
}
sort(p+,p+sz+,cmp3);
F(i,,sz){
r=p[i].r;
for(j=i+;j<=sz;j++){
if(p[j].l>r)break;
if (r<p[j].r) r=p[j].r;
}
len+=r-p[i].l; i=j-;
}
return len;
}
db cal(db l,db fl,db fmid,db fr){
return (fl+fmid*+fr)*l/;
}
db simpson(db l,db mid,db r,db fl,db fmid,db fr,db s){
db m1=(l+mid)/,m2=(mid+r)/;
db f1=getf(m1),f2=getf(m2);
db g1=cal(mid-l,fl,f1,fmid),g2=cal(r-mid,fmid,f2,fr);
if (fabs(g1+g2-s)<eps)return g1+g2;
return simpson(l,m1,mid,fl,f1,fmid,g1)+
simpson(mid,m2,r,fmid,f2,fr,g2);
}
void work(){
int i,j;
db l,r,mid,fl,fr,fmid;
F(i,,n){
xl[i]=sk[i].x-sk[i].r;
xr[i]=sk[i].x+sk[i].r;
sk[i].r*=sk[i].r;
}
F(i,,n){
l=xl[i]; r=xr[i];
for(j=i+;j<=n;j++){
if (xl[j]>r) break;
if (xr[j]>r) r=xr[j];
}
st=i; ed=j-;i=j-;
mid=(l+r)/;
fl=getf(l); fr=getf(r); fmid=getf(mid);
ans+=simpson(l,mid,r,fl,fmid,fr,cal(r-l,fl,fmid,fr));
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2178.in","r",stdin);
freopen("2178.out","w",stdout);
#endif
init();
work();
printf("%.3lf",ans);
return ;
}
2178: 圆的面积并
Time Limit: 20 Sec Memory Limit: 259 MB
Submit: 908 Solved: 218
[Submit][Status][Discuss]
Description
Input
接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数
Output
Sample Input
721
。。。。。。
Sample Output
HINT
Source
【BZOJ】【2178】圆的面积并的更多相关文章
- BZOJ 2178: 圆的面积并 [辛普森积分 区间并]
2178: 圆的面积并 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1740 Solved: 450[Submit][Status][Discus ...
- [BZOJ 2178] 圆的面积并 【Simpson积分】
题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13 2)要去掉被其他圆包含的圆. ...
- bzoj 2178 圆的面积并 —— 辛普森积分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...
- bzoj 2178 圆的面积并——辛普森积分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 把包含的圆去掉.横坐标不相交的一段一段圆分开算.算辛普森的时候预处理 f( ) ,比如 ...
- bzoj 2178 圆的面积并【simpson积分】
直接套simpson,f可以直接把圆排序后扫一遍所有圆,这样维护一个区间就可以避免空段. 然而一定要去掉被其他圆完全覆盖的圆,否则会TLE #include<iostream> #incl ...
- BZOJ 2178 圆的面积并 ——Simpson积分
[题目分析] 史上最良心样例,史上最难调样例. Simpson积分硬上. 听说用long double 精度1e-10才能过. 但是double+1e-6居然过了. [代码] #include < ...
- BZOJ 2178: 圆的面积并 (辛普森积分)
code #include <set> #include <cmath> #include <cstdio> #include <cstring> #i ...
- 【BZOJ】2178: 圆的面积并
http://www.lydsy.com/JudgeOnline/problem.php?id=2178 题意:给出n<=1000个圆,求这些圆的面积并 #include <cstdio& ...
- [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并
[SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...
随机推荐
- VS2010 自动关闭的问题解决方法
分为如下几个解决方法: 没有安装VS2010的SP1,安装后,问题解决了 自定义设置,出现了不正确的情况,执行 devenv.exe /resetsettings 可以排除故障 使用 devenv.e ...
- html判断IE版本
html判断IE版本 . <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> . <!--[if IE]> ...
- maraidb半同步复制
半同步复制是在主从同步复制的基础之上,主从同步前面我的博文有介绍 Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库 MySQL在加载 ...
- WordPress默认栏目设置
WordPress是一个注重美学.易用性和网络标准的个人信息发布平台,是全球使用最多的博客系统,只需要在系统后台做一些简单的设计,基本就能实现我们日常个性化发布个人信息的需求,而博客后台的使用其实很简 ...
- 带有×的EditText
代码: EditTextWithDel.java(直接复制): package com.sunday.customs; import com.example.customs.R; import and ...
- 每天进步一点--c#基础巩固,事件、委托
要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子 ...
- partition实现
partition的作用是把环形缓冲区中的map输出分区存储,以便分配给不同的reducer. 把内部的实现写下来,作为一个学习笔记 在map函数,调用context.write()时,会去调用分区函 ...
- UCOS2_STM32F1移植详细过程(三)
Ⅰ.概述 上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和o ...
- 【转】 BSS段 数据段 代码段 堆栈 指针 vs 引用
原文:http://blog.csdn.net/godspirits/article/details/2953721 BSS段 数据段 代码段 堆栈 (转+) 声明:大部分来自于维基百科,自由的百科全 ...
- java 切换
Android L之后推荐使用JDK7编译程序,这是自然发展规律,就像是4年前编译Android 1.6需要使用JDK5一样. 多版本JDK是可以共存的,只需要使用update-alternative ...