【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#中winform的MVP模式的简单实现
MVP模式是类似于MVC模式的一种设计模式,最近在做项目学习过程中遇到,弄了很久终于有一些眉目,这是学习过程中的一些笔记.MVP指的是实体对象Model.视图Viw和业务处理Presenter.MVP ...
- AMD平台下在Windows虚拟机中安装Mac10.8.6【Written By KillerLegend】
我的电脑CPU是AMD,以前在虚拟机中装过Windows操作系统,感觉很简单,这几天想体验一下苹果系统,未来也可能会从事Mac相关软件开发,于是从早上便兴致勃勃的开始了--于是悲剧也开始了,上网各种查 ...
- 在Linux 5/6上使用UDEV SCSI规则配置ASM DISK
格式化磁盘(略) 识别磁盘(/sbin/scsi_id) Oracle Linux 5用如下脚本: #!/bin/sh for i in b c d e f g do echo "KERN ...
- MVC中Model,不仅仅只是数据的传递者
在Model使用的时候很多人回向以前写三层架构一样使用它,将Model作为数据的传递者. 比如常见的写法 public int Id { get; set; } public int RoleId { ...
- Perl 随机数和随机密码的产生
Perl有着强大的随机数产生函数rand(),下面的代码详细介绍其应用 #!/usr/bin/perl # use strict; use warnings; # 0~1之间 $rando ...
- sublimeLinter-jshint 配置
这几天知道sublime3有可以对javascript进行语法检查的文件,折腾了一上午,搞定了. 记录一下步骤: 1.先安装nodejs. 2.npm install jshint -g 3.通过su ...
- WPF动画 storyboard
<Window x:Class="StoryBoard.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- StyleCop学习笔记——默认的规则
在StyleCop中有一些官方自己写好的检测规则下面就是英文的解释 文档规则 1.SA1600:ElementsMustBeDocumented元素必须添加注释 2.SA1601: PartialEl ...
- Linux 虚拟机和物理机配互信出现无法连接
配置文件位置:[root@hank-yoon data]# vi /etc/ssh/sshd_configPermitRootLogin yes 在物理机中,装完系统,默认情况下PermitRootL ...
- 数据库事务故障恢复undo日志检查点
checkpoint 检查点 checkpoint,即检查点.在undolog中写入检查点,表示在checkpoint前的事务都已经完成commit或者rollback 了,也就是检查点前面的事务 ...