【BZOJ4675】点对游戏

Description

桑尼、露娜和斯塔在玩点对游戏,这个游戏在一棵节点数为n的树上进行。
桑尼、露娜和斯塔三人轮流从树上所有未被占有的节点中选取一点,归为己有,轮流顺序为桑尼、露娜、斯塔、桑尼、露娜……。该选取过程直到树上所有点都被选取后结束。
选完点后便可计算每人的得分。点对游戏中有m个幸运数,在某人占据的节点中,每有一对点的距离为某个幸运数,就得到一分。(树上两点之间的距离定义为两点之间的简单路径的边数)
你的任务是,假设桑尼、露娜和斯塔每次选取时,都是从未被占有的节点中等概率选取一点,计算每人的期望得分。

Input

第一行两个整数n、m,分别表示树的节点数和幸运数的数目。
第二行m个互异正整数,表示m个幸运数。
以下n-1行,每行两个整数u、v,表示节点u和节点v之间有边。节点从1
到n编号。
3 <= n <= 50000, m <= 10,幸运数大小 <= n

Output

三行实数,分别表示桑尼、露娜和斯塔的期望得分,保留两位小数。

Sample Input

5 2
1 3
1 2
1 5
2 3
2 4

Sample Output

0.60
0.60
0.00

题解:本题的做法比较神。

先用点分治统计出所有幸运点对的个数,然后分别统计每个人都选出了多少个点对,用选出的点对数*幸运点对数/总点对数 即是答案。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=50010;
int sum;
int n,m,cnt,rt,mn,tot;
int to[maxn<<1],next[maxn<<1],head[maxn],dep[maxn],vis[maxn],siz[maxn],luck[20],f[maxn],g[maxn],md[maxn];
double ans[maxn],s[maxn];
void getrt(int x,int fa)
{
siz[x]=1;
int tmp=0;
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa&&!vis[to[i]])
getrt(to[i],x),siz[x]+=siz[to[i]],tmp=max(tmp,siz[to[i]]);
tmp=max(tmp,tot-siz[x]);
if(tmp<mn) mn=tmp,rt=x;
}
void getmd(int x,int fa,int dep)
{
siz[x]=1,md[x]=0;
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa&&!vis[to[i]])
getmd(to[i],x,dep+1),siz[x]+=siz[to[i]],md[x]=max(md[x],md[to[i]]+1);
}
void getdep(int x,int fa,int dep)
{
g[dep]++;
for(int i=1;i<=m;i++) if(dep<=luck[i]) sum+=f[luck[i]-dep];
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa&&!vis[to[i]]) getdep(to[i],x,dep+1);
}
void dfs(int x)
{
vis[x]=1;
getmd(x,0,0);
f[0]=1;
for(int i=head[x];i!=-1;i=next[i]) if(!vis[to[i]])
{
getdep(to[i],x,1);
for(int j=0;j<=md[to[i]]+1;j++) f[j]+=g[j],g[j]=0;
}
memset(f,0,sizeof(f[0])*(md[x]+2));
for(int i=head[x];i!=-1;i=next[i]) if(!vis[to[i]]) tot=siz[to[i]],mn=1<<30,getrt(to[i],x),dfs(rt);
}
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
//freopen("game0.in","r",stdin);
//freopen("game.out","w",stdout);
n=rd(),m=rd();
int i,a,b;
for(i=1;i<=m;i++) luck[i]=rd();
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
tot=n,mn=1<<30,getrt(1,0),dfs(rt);
a=(n+2)/3,printf("%.2lf\n",1.0*a*(a-1)*sum/(1.0*n*(n-1)));
a=(n+1)/3,printf("%.2lf\n",1.0*a*(a-1)*sum/(1.0*n*(n-1)));
a=n/3,printf("%.2lf\n",1.0*a*(a-1)*sum/(1.0*n*(n-1)));
return 0;
}

【BZOJ4675】点对游戏 树分治+期望的更多相关文章

  1. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  2. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  3. 【BZOJ4184】shallot(线段树分治,线性基)

    [BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...

  4. 点分治Day2 动态树分治

    蒟蒻Ez3real冬令营爆炸之后滚回来更新blog... 我们看一道题 bzoj3924 ZJOI2015D1T1 幻想乡战略游戏 给一棵$n$个点的树$(n \leqslant 150000)$ 点 ...

  5. 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月

    考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...

  6. [HDU4867]Xor (线段树分治+类数位dp)

    [HDU4867]Xor (线段树分治+类数位dp) 提供一种\((m+n) log a log m\)带有常数约\(\frac{1}{log n}\)的算法 处理询问,将后来加入的数算进序列中,则每 ...

  7. hdu-5977 Garden of Eden(树分治)

    题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  8. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

  9. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

随机推荐

  1. Linux-《Linux命令行与shell脚本编程大全》阅读笔记

    1.内核负责的主要功能 系统内存管理.软件程序管理.硬件设备管理.文件系统管理 2.GNU工具链 Linux内核是系统的核心,控制着内存.程序和硬件等是如何与对方交互的.内核还需要工具链来执行一些标准 ...

  2. 基于easyui fom分组插件

    本插件适用于表单按属性分组,可以动态设置显示的列数,每一个表单宽度,表单类型,以及对齐.不同panel之间的表单也是对齐的. 效果: 依赖:jquery ,easyui, 实现过程:整个控件一个pan ...

  3. FreeSWITCH小结:关于export的原理介绍及应用

    FreeSWITCH小结:关于export的原理介绍及应用 Export原理 普通export用法 在dialplan中经常会用到export,如下所示: <action application ...

  4. 【Android应用开发技术:用户界面】布局管理器

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  5. C#生日提醒小工具

    一个很粗糙的版本,就当一个小例子看一下吧, 运行效果如下: 开发环境VS2017,用的WinForm,涉及一点xml,直接上图. 一.项目涉及的文件如下图: 二.每个文件内容: 1.MainForm  ...

  6. DirectShow中写push模式的source filter流程 + 源码(内附具体凝视)

    尽管网上已有非常多关于DirectShow写source filter的资料.只是非常多刚開始学的朋友总说讲的不是非常清楚(可能当中作者省略了很多他觉得简 单的过程).读者总希望看到象第一步怎么做,第 ...

  7. EM5-PE2B

    1. vocabulary once adv. 一次,曾经 They cocktailed once every week. He once lived in shanghai. twice adv ...

  8. Oracle之批量生成数据

    一.引言 由于测试程序,需要大量的数据 二.方法 1.pl/sql的Generate Data,在tool菜单中可以找到,但是我这里不能用,老是出现错误,应该是软件的原因,但是没找到解决办法,如下图: ...

  9. tomcat能启动正常,但是输入localhost:8080不能登录

    怎么配置JDK和TOMCAT应该百度经验已经很好地解释了. tomcat启动成功了,但是  localhost:8080  登录不成功. 有一种可能,缺少http:// 输入: http://loca ...

  10. springmvc-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...