【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)\)个圆的面积并. 思路: 对于一个\( ...
随机推荐
- c语言学习的第10天
#include <stdio.h> int main() { int many; printf("你想看几次?"); scanf("%d",&am ...
- 分布式MySQL集群方案的探索与思考
转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...
- Lua 多维表的遍历中的赋值
说到Lua的遍历将要使用到循环:先说遍历再说循环: 遇到这样类似结构的一个table Data={ []={p1=,pa={,,}}, []={p1=,pa={,,}}, []={p1=,pa={,, ...
- ASP.NET MVC5学习笔记之Filter提供体系
前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的. 一.Filter集合 在ControlerActionI ...
- BufferedInputSream和BufferedOutputSream,,,
package cd.itcast.bufferinputstream; import java.io.BufferedInputStream; import java.io.File; import ...
- Java 第六天 Spring Annotation 和其它
Annotation,是Java语言中的一种特殊的元数据语法,Spring支持使用annotation来进行对象实例化和装配 使用Annotation在Spring的配置xml中添加context命名 ...
- Scut游戏服务器免费开源框架--快速开发(2)
Scut快速开发(2) Python脚本开发 1 开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a) IIS和消息队列(MSMQ) 进入控制面板,程序和功能 b) ...
- 禁止生成文件Thumbs.db
Thumbs.db是一个用于Microsoft Windows XP.Windows7 或 mac os x缓存Windows Explorer的缩略图的文件.Thumbs.db保存在每一个包含图片或 ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
- spring使用JdbcDaoSupport中封装的JdbcTemplate进行query
1.Dept package cn.hxex.springcore.jdbc; public class Dept { private Integer deptNo; private String d ...