题面

传送门

题解

首先您得会用格林公式计算圆的面积并

这里只需要动态维护一下圆弧就可以了

时间复杂度\(O(n^2\log n)\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=2005;const double Pi=acos(-1.0);
struct Point{int x,y;inline Point(){}inline Point(R int xx,R int yy):x(xx),y(yy){}inline Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}inline Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}inline double norm(){return sqrt(x*x+y*y);}inline double ang(){return atan2(y,x);}
};
struct Cir{Point p;int r;inline double oint(R double t1,R double t2){return r*(r*(t2-t1)+p.x*(sin(t2)-sin(t1))-p.y*(cos(t2)-cos(t1)));}inline bool in(const Cir &b)const{return (p-b.p).norm()+b.r<=r;}inline bool out(const Cir &b)const{return r+b.r<=(p-b.p).norm();}
}c[N];
struct node{double l,r;inline node(R double ll,R double rr):l(ll),r(rr){}inline bool operator <(const node &b)const{return r<b.r;}
};
set<node>s[N];double res;int n;bool vis[N];
typedef set<node>::iterator IT;
inline void upd(R double &ang){if(ang<-Pi)ang+=2*Pi;if(ang>Pi)ang-=2*Pi;
}
void remove(int id,double l,double r){for(IT it=s[id].lower_bound(node(0,l)),tmp;it!=s[id].end()&&it->l<r;it=tmp){double nl=it->l,nr=it->r;tmp=it,++tmp,s[id].erase(it),res-=c[id].oint(nl,nr);if(nl<l)s[id].insert(node(nl,l)),res+=c[id].oint(nl,l);if(nr>r)s[id].insert(node(r,nr)),res+=c[id].oint(r,nr);}
}
int main(){
//  freopen("testdata.in","r",stdin);scanf("%*d%d",&n);fp(i,1,n){vis[i]=1;scanf("%d%d%d",&c[i].p.x,&c[i].p.y,&c[i].r);fp(j,1,i-1)if(vis[j]){if(c[j].r>=c[i].r&&c[j].in(c[i])){vis[i]=0;break;}if(c[i].r>c[j].r&&c[i].in(c[j]))vis[j]=0,remove(j,-Pi,Pi);}if(!vis[i]){printf("%.10lf\n",res*0.5);continue;}res+=c[i].r*c[i].r*Pi*2,s[i].insert(node(-Pi,Pi));fp(j,1,i-1)if(vis[j]&&!c[i].out(c[j])){double dis=(c[i].p-c[j].p).norm(),ang,cur,l,r;cur=(c[j].p-c[i].p).ang();ang=acos((dis*dis+c[i].r*c[i].r-c[j].r*c[j].r)/(2*c[i].r*dis));l=cur-ang,r=cur+ang,upd(l),upd(r);if(l<=r)remove(i,l,r);else remove(i,-Pi,r),remove(i,l,Pi);cur=(c[i].p-c[j].p).ang();ang=acos((dis*dis+c[j].r*c[j].r-c[i].r*c[i].r)/(2*c[j].r*dis));l=cur-ang,r=cur+ang,upd(l),upd(r);if(l<r)remove(j,l,r);else remove(j,-Pi,r),remove(j,l,Pi);}printf("%.10lf\n",res*0.5);}return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10750655.html

UOJ#419. 【集训队作业2018】圆形(格林公式)相关推荐

  1. uoj#422. 【集训队作业2018】小Z的礼物

    uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...

  2. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  3. UOJ#449. 【集训队作业2018】喂鸽子

    #449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...

  4. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  5. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...

  6. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...

  7. uoj#420. 【集训队作业2018】矩形(组合数学)

    题面 传送门 题解 这辣鸡题目做了咱整整三天--咱果然还是太菜了--好珂怕的推倒啊-- 首先把它变成 \[\left( \sum_{i = 1}^{n} \sum_{j = 1}^{m} F(i, j ...

  8. uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)

    题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...

  9. UOJ418. 【集训队作业2018】三角形

    http://uoj.ac/problem/418 题解 考虑激活每个节点时,它的每个儿子都是放满的. 那每一次的操作我们可以用一个二元组来表示\((w_i-\sum w_{son},\sum w_{ ...

最新文章

  1. 盘点类别级物体6D位姿估计
  2. oracle你如何重置序列号,oracle sequence语句重置方介绍
  3. Mysql找回管理员password
  4. ubuntu下为opera26.0安装flash
  5. opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结
  6. 3B大战引来的担忧:百度重仓云计算拟摆脱困局
  7. 深入理解Android(三):Xposed详解
  8. matlab thetal,基於matlab的車道和車道線檢測樣例
  9. Django contenttypes组件
  10. android studio 安装apk失败,AndroidStudio安装apk时失败时提示INSTALL_PARSE_FAILED_NO_CERTIFICATES...
  11. “再见,Linux!”
  12. 【机器学习】决策树的理论与实践
  13. MySQL 宣布停止使用 master、slave!
  14. 数据包络分析例题解析(含MATLAB代码)
  15. 备份路由器配置文件到服务器,手把手教您如何进行备份Cisco路由器配置
  16. react组件书写规范
  17. VM中的Ubuntu能ping通外网浏览器不能上网
  18. 浙大160位学者入选2020“中国高被引学者” 榜单!
  19. 自动化测试之Python+selenium
  20. WiFi - 访客网络有什么用?怎么开启?

热门文章

  1. Coursera公开课-Machine_learing:编程作业7
  2. AVAudioSession
  3. 开发iOS即时通讯工具参考的一些开源、框架和教程
  4. 移动发布手机病毒警示信息 发现六种新型病毒
  5. shell(希尔)排序
  6. DevCon.exe (DevCon Command Line Utility)
  7. js中给多个class属性的标签赋值
  8. dreamweaver 正则表达式为属性值加上双引号_Python正则表达式(一)
  9. 电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了
  10. 奔腾双核linux服务器,Dell推出双核心奔腾服务器