【HNOI2016模拟4.4】Stage
来源:互联网 发布:蒙古作文软件 编辑:程序博客网 时间:2024/06/06 13:17
Description
N,M<=1e3
Solution
考虑每个点被观察到的概率
这样很难算我们可以计算每个点不被观察到的概率
这个等价于把这个点和所有观察点拉出来一起做凸包,这个点出现在凸包上的概率
那么我们可以枚举两条边,计算这两条边出现的概率
就是这两条边外部的点全部不出现
这些点把所有观察点关于这个点做极角排序后是连续的一段
所以可以用一个数据结构维护一段点的(1-p)的积
然后观察答案式子发现是可以线性做的
为了避免算重强制第二条边都在第一条边的左手系
Code
#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;typedef double db;const int N=1e3+5;int n,m;db ans,sum[N][10],pre[N],suf[N];struct DOT{int x,y;db p;}a[N],p[N],rt;ll cro(DOT x,DOT y,DOT rt) { return (ll)(x.x-rt.x)*(y.y-rt.y)-(ll)(x.y-rt.y)*(y.x-rt.x);}bool cmp(DOT x,DOT y) { return atan2(x.y-rt.y,x.x-rt.x)<atan2(y.y-rt.y,y.x-rt.x);}db get_sum(int l,int r) { if (l>r) return 1; db res=1; fd(j,9,0) if (l+(1<<j)<=r) res*=sum[l][j],l+=(1<<j); return res*sum[r][0];}int main() { scanf("%d%d",&n,&m); fo(i,1,n) scanf("%d%d",&a[i].x,&a[i].y); fo(i,1,m) scanf("%d%d%lf",&p[i].x,&p[i].y,&p[i].p); fo(i,1,n) { rt=a[i]; sort(p+1,p+m+1,cmp); db now=0;ans+=1; fo(j,1,m) sum[j][0]=1-p[j].p; fo(k,1,9) fo(j,1,m-(1<<(k-1))) sum[j][k]=sum[j][k-1]*sum[j+(1<<(k-1))][k-1]; pre[0]=1;fo(j,1,m) pre[j]=pre[j-1]*(1-p[j].p); suf[m+1]=1;fd(j,m,1) suf[j]=suf[j+1]*(1-p[j].p); fo(j,1,m) ans-=pre[j-1]*suf[j+1]*p[j].p;ans-=pre[m]; int k=1; while (k<m&&cro(p[k+1],p[1],rt)<0) { ++k; now+=get_sum(k+1,m)*p[k].p; } ans-=now*p[1].p;if (k==1) k++; fo(j,2,m) { if (cro(p[j-1],p[j],rt)>=0) now-=get_sum(1,j-2)*get_sum(j+1,m)*p[j].p; now*=(1-p[j-1].p); while (k%m+1!=j&&cro(p[k%m+1],p[j],rt)<0) { k=k%m+1; if (j<k) now+=get_sum(1,j-1)*get_sum(k+1,m)*p[k].p; else now+=get_sum(k+1,j-1)*p[k].p; } ans-=now*p[j].p; if (j==k) k++; } } printf("%.6lf\n",ans);}
阅读全文
0 0
- 【HNOI2016模拟4.4】Stage
- [JZOJ4426]. 【HNOI2016模拟4.4】Stage
- 【JZOJ4426】【HNOI2016模拟4.4】Stage
- 【HNOI2016模拟4.4】Stage(几何&&倍增)
- 【HNOI2016模拟4.4】Alphadog
- 【HNOI2016模拟4.4】Fenwit
- 【JZOJ4425】【HNOI2016模拟4.4】Fenwit
- HNOI2016模拟 disk
- 【HNOI2016模拟3.26】A
- 【HNOI2016模拟4.13】a
- 【HNOI2016模拟4.14】A
- 【JZOJ4427/HNOI2016模拟】 Alphadog
- JZOJ4446. 【HNOI2016模拟4.14】B
- 【HNOI2016模拟4.10】 K小数查询
- 【HNOI2016模拟4.10】 K小数查询
- 【HNOI2016模拟4.10】线性代数与逻辑
- 【HNOI2016模拟4.1】神奇的字符串
- JZOJ 4437. 【HNOI2016模拟4.10】线性代数与逻辑
- Java.5集合框架
- 关于郭天祥51单片机教程视频课后题《同时用两个定时器控制蜂鸣器发声》
- Nginx 反向代理、负载均衡、页面缓存、URL 重写及读写分离详解
- JS编程训练 | 题13:查找元素位置
- JDBC环境搭建(IDEA开发工具)
- 【HNOI2016模拟4.4】Stage
- navicat连接oracle
- 【表单】illuminate/html与laravelcollective/html【原创】
- Java分层思想:Action层, Service层 ,modle层 和 Dao层的功能区分
- Introduction to Vectors answer
- POJ-1287(裸的Krustra)
- python 环境搭建。
- python学习(7)——面向对象编程
- CSS中清除浮动的方式