[BZOJ4775][点分树][概率与期望][数学][卡精度]网管
来源:互联网 发布:淘宝 三文鱼 编辑:程序博客网 时间:2024/05/12 03:10
大小号贡献13次提交……
这题卡精度啊!!有个地方int改成long long就过了
首先,平方的期望不等于期望的平方,
在这题中p就是这个节点为黑点的概率
推一推咯
那么就可以考虑如何在点分树上维护这些东西
考虑当前重心
维护一下这些西格玛就行了
#include <cstdio>#include <iostream>#include <algorithm>#define N 200010#define eps 1e-10using namespace std;typedef pair<double,double> par;int n,m,Size,Max,cnt;int vis[N],p[N],G[N],dpt[N];int fa[N][25];double w[N],d[N],pw[N],pd[N],A1[N],pA1[N],A2[N],pA2[N],A3[N],pA3[N];par A[N];struct edge{ int t,nx;}E[N<<2];inline void rea(int &x){ char c=getchar(); x=0; for(;c>'9'||c<'0';c=getchar()); for(;c>='0'&&c<='9';x=x*10+c-'0',c=getchar());}inline int LCA(int x,int y){ if(dpt[x]<dpt[y]) return LCA(y,x); for(int i=20;~i;i--) if(dpt[fa[x][i]]>=dpt[y]) x=fa[x][i]; if(x==y) return x; for(int i=20;~i;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; return fa[x][0];}inline int dis(int x,int y){ return dpt[x]+dpt[y]-2*dpt[LCA(x,y)];}void dfs(int x,int f){ fa[x][0]=f; dpt[x]=dpt[f]+1; for(int i=1;i<=20;i++) fa[x][i]=fa[fa[x][i-1]][i-1]; for(int i=G[x];i;i=E[i].nx) if(E[i].t!=f) dfs(E[i].t,x);}int explore(int x,int f){ int ret=1; for(int i=G[x];i;i=E[i].nx) if(E[i].t!=f&&!vis[E[i].t]) ret+=explore(E[i].t,x); return ret;}int Root(int x,int f,int &R){ int S=1,iMax=0; for(int i=G[x];i;i=E[i].nx) if(E[i].t!=f&&!vis[E[i].t]){ int k=Root(E[i].t,x,R); if(k>iMax) iMax=k; S+=k; } if(iMax<Size-S) iMax=Size-S; if(iMax<Max) Max=iMax,R=x; return S;}void divide(int x,int f){ Size=explore(x,0); int k; Max=1<<30; Root(x,0,k); vis[k]=1; p[k]=f; for(int i=G[k];i;i=E[i].nx) if(!vis[E[i].t]) divide(E[i].t,k);}inline void Insert(int x,int y){ E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt; E[++cnt].t=x; E[cnt].nx=G[y]; G[y]=cnt;}inline void Add(int x){ double y=A[x].first*(1-A[x].first); w[x]+=A[x].first; A3[x]+=y; for(int i=x;p[i];i=p[i]){ int D=dis(x,p[i]); d[p[i]]+=D*A[x].first; pd[i]+=D*A[x].first; w[p[i]]+=A[x].first; pw[i]+=A[x].first; A1[p[i]]+=D*D*y; pA1[i]+=D*D*y; A2[p[i]]+=2*D*y; pA2[i]+=2*D*y; A3[p[i]]+=y; pA3[i]+=y; }}inline void Del(int x){ double y=A[x].first*(1-A[x].first); w[x]-=A[x].first; A3[x]-=y; for(int i=x;p[i];i=p[i]){ int D=dis(x,p[i]); d[p[i]]-=D*A[x].first; pd[i]-=D*A[x].first; w[p[i]]-=A[x].first; pw[i]-=A[x].first; A1[p[i]]-=D*D*y; pA1[i]-=D*D*y; A2[p[i]]-=2*D*y; pA2[i]-=2*D*y; A3[p[i]]-=y; pA3[i]-=y; }}inline void Query(int x){ double Ans1=d[x],Ans2=A1[x]; for(int i=x;p[i];i=p[i]){ long long D=dis(x,p[i]);//!!! Ans1+=d[p[i]]-pd[i]+D*w[p[i]]-D*pw[i]; Ans2+=A1[p[i]]-pA1[i]+A2[p[i]]*D-pA2[i]*D+D*D*A3[p[i]]-D*D*pA3[i]; } printf("%.13lf\n",Ans1*Ans1+Ans2);}int main(){ freopen("4775.in","r",stdin); freopen("4775.out","w",stdout); rea(n); rea(n); rea(m); for(int i=1;i<=n;i++){ int x; rea(x); A[i]=par(x,x^1); } for(int i=1;i<n;i++){ int x,y; rea(x); rea(y); Insert(x,y); } divide(1,0); dfs(1,0); for(int i=1;i<=n;i++) Add(i); while(m--){ int op;rea(op); if(op&1){ int x,p; rea(x); rea(p); double k=p/100.0,k1=(100-p)/100.0; Del(x); A[x]=par(A[x].second*k+A[x].first*k1,A[x].first*k+A[x].second*k1); Add(x); } else{ int x; rea(x); Query(x); } }}
0 0
- [BZOJ4775][点分树][概率与期望][数学][卡精度]网管
- 概率与数学期望
- LightOJ1030(数学概率与期望)
- lightoj1038(数学概率与期望)
- lightoj1079(数学概率与期望)
- lightoj1104(数学概率与期望)
- lightoj1027(数学期望与概率)
- LightOJ1408(数学期望与概率)
- lightoj1274(数学概率与期望)
- lightoj1284(数学概率与期望)
- uva11427(数学概率与期望)
- 概率与数学期望简单题
- POJ 3716 条件概率与数学期望
- 【Uva1639】概率 + 期望 + 对数处理精度
- 概率统计与机器学习:期望,方差,数学期望,样本均值,样本方差之间的区别
- 概率与期望
- 各种期望与概率
- 概率与期望
- struts2中 # % $ (井号,星号,百分号)的区别和用法
- 博客之旅
- rigidbody中Is Kinematic选中后不受force影响
- 线索二叉树
- AngularJs事件大集合
- [BZOJ4775][点分树][概率与期望][数学][卡精度]网管
- JavaScript事件模拟元素拖动
- ubuntu 16.04下搜狗输入法不能输入中文解决
- 全排列算法(递归)
- 10分钟学会Markdown常用语法在markdown编辑器中的显示效果
- java基础
- python进行中文文本聚类实例(TFIDF计算、词袋构建)
- 猜数字小游戏
- Servlet二