题解:

还好。。。看懂题目就好做了。(Orzdyh)

首先选择的点是等概率随机的,也就是说每种选择结果的概率都是一样的,所以选择一个点的时候已经选择的点不会有影响,那么就可以直接算出点对个数再求总体的期望。具体来说,每条边会在$\binom{n-2}{\lceil\frac{n}{3}\rceil -1}$种情况中被选择(说不清楚,感性理解一下),再除以总的情况数$\binom{n}{\lceil\frac{n}{3}\rceil}$即可,这一步可以约分,注意要对$n\mod 3$的余数分类讨论。

前面的部分是点分治经典应用,就不说了。我貌似写的很挫,第一次有三个点T了20ms,其他人一共就跑了20ms。。。第二次加了读入优化999ms过了。。。妙不可言

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,next;
}a[];
int n,m,u,v,lk[],anss[],sum=,S,rt,tot=,cnt=,head[],siz[],mx[],dis[];
bool used[];
double ans1,ans2;
char buffer[],*hd,*tl;
inline char Getchar(){
if(hd==tl){
int len=fread(buffer,,,stdin);
hd=buffer,tl=hd+len;
if(hd==tl)
return EOF;
}
return *hd++;
}
inline int rd(){
register int x=;
char c;
do c=Getchar();
while(!isdigit(c));
do{
x=(x<<)+(x<<)+(c^);
c=Getchar();
}while(isdigit(c));
return x;
}
inline void add(int u,int v){
a[++tot].v=v;
a[tot].next=head[u];
head[u]=tot;
}
inline void dfsrt(int u,int ff){
siz[u]=;
mx[u]=;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=ff&&!used[v]){
dfsrt(v,u);
mx[u]=max(mx[u],siz[v]);
siz[u]+=siz[v];
}
}
mx[u]=max(mx[u],S-siz[u]);
if(mx[u]<mx[rt])rt=u;
}
inline void getdis(int u,int fa,int ds){
dis[++cnt]=ds;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=fa&&!used[v])getdis(v,u,ds+);
}
}
inline int gao1(int l,int r,int k){
int ret=-;
while(l<=r){
int mid=(l+r)/;
if(dis[mid]==k)ret=mid,l=mid+;
else if(dis[mid]<k)l=mid+;
else r=mid-;
}
return ret;
}
inline int gao2(int l,int r,int k){
int ret=;
while(l<=r){
int mid=(l+r)/;
if(dis[mid]==k)ret=mid,r=mid-;
else if(dis[mid]<k)l=mid+;
else r=mid-;
}
return ret;
}
inline int calc(int u,int w,int K){
cnt=;
getdis(u,,w);
sort(dis+,dis+cnt+);
//for(int i=1;i<=cnt;i++)printf("%d ",dis[i]);
//printf("\n");
int ret=;
for(int i=;i<=cnt;i++){
if(dis[i]*>K)break;
ret+=gao1(i,cnt,K-dis[i])-gao2(i,cnt,K-dis[i])+;
}
return ret;
}
inline void divide(int u){
used[u]=true;
for(int i=;i<=m;i++)anss[i]+=calc(u,,lk[i]);
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(!used[v]){
for(int i=;i<=m;i++){
anss[i]-=calc(v,,lk[i]);
}
S=siz[v],rt=;
dfsrt(v,);
divide(rt);
}
}
}
int main(){
memset(head,-,sizeof(head));
memset(anss,,sizeof(anss));
//scanf("%d%d",&n,&m);
n=rd(),m=rd();
for(int i=;i<=m;i++)lk[i]=rd();//scanf("%d",&lk[i]);
for(int i=;i<n;i++){
//scanf("%d%d",&u,&v);
u=rd();
v=rd();
add(u,v);
add(v,u);
}
S=n,mx[rt=]=;
dfsrt(,);
divide(rt);
//for(int i=1;i<=m;i++)printf("%d ",anss[i]);
for(int i=;i<=m;i++)sum+=anss[i];
if(n%==||n%==){
ans1=(double)((double)sum*(n/)*(n/+))/(double)((double)n*(n-));
if(n%==)printf("%.2lf\n",ans1);
else printf("%.2lf\n%.2lf\n",ans1,ans1);
}
ans2=(double)((double)sum*(n/)*(n/-))/(double)((double)n*(n-));
if(n%==)printf("%.2lf\n%.2lf\n%.2lf",ans2,ans2,ans2);
else if(n%==)printf("%.2lf\n%.2lf",ans2,ans2);
else printf("%.2lf",ans2);
return ;
}

(WC2018模拟十二)【FJOI2016集训Day7T2】点对游戏的更多相关文章

  1. (WC2018模拟十二)【FJOI2016集训Day7T1】挑选子序列

    题解: 这题太神仙了,先咕着,放个令人****的官方题解(精确覆盖问题是NP完全问题啊摔) Dancing Link X学习资料:QAQ TAT qwq Orz Donald Knuth大神... p ...

  2. (WC2018模拟十二)【FJOI2016集训Day7T3】Xor-Mul棋盘

    是不是应该第100篇博文纪念一下? 题解: 本质简单题...但是我没仔细看这题... 观察它的两个式子,都是xor完再乘以某个数,意味着d数组的每个二进制位对答案的贡献都是独立的,可以每一位分开处理. ...

  3. NOIp2018模拟赛四十二

    今天看标题终于回到了“NOIP模拟赛”,十分高兴啊! 然后一打开题目: ********** 所以今天又是一场NOIPlus模拟赛(微笑) 成绩:0+70+0=70 A题想了个贪心被myh两分钟cha ...

  4. 第十二章Fundamental Data Types 基本数据类型

    目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1   数值概论 ...

  5. 【腾讯Bugly干货分享】腾讯验证码的十二年

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581301b146dfb1456904df8d Dev Club 是一个交流移动 ...

  6. (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  8. Linux基础入门(新版)(实验九-实验十二)

    实验九 简单文本入门 一.常用的文本处理命令 二.文本处理命令 1.tr 命令 tr 命令可以用来删除一段文本信息中的某些文字.或者将其进行转换. 使用方式: tr [option]...SET1 [ ...

  9. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

随机推荐

  1. APUE学习笔记7——进程间通信

    1 管道 管道一般是一种半双工的进程间通信方式,只能够在具有公共祖先的进程之间使用,比如一个管道由一个进程创建,然后该进程调用fork,之后父.子进程就可以使用该管道. 管道是调用pipe函数创建的. ...

  2. 04《UML大战需求分析》之四

    在学习完顺序图之后,流程分析的三种图,我已经学习完了我,但是我还需要大量地锻炼,这样才可以更加熟练地掌握几种图的使用和方法.接下来,我学习了用例图,用来描述系统的行为. 虽然是一同学习的,但是对用例图 ...

  3. iOS-Core-Animation-Advanced-Techniques/12-性能调优/性能调优.md

    性能调优 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  4. echart纵坐标标签特别长换行显示

    纵坐标 yAxis : [ { type : 'category', data : name, axisLabel: { //坐标轴刻度标签的相关设置. textStyle: { color: '#0 ...

  5. redis 篇 - hash

    hash 可以认为是 python 中的字典 field 不允许重复 string类型的field和value的映射表 每个hash可以存储 232 - 1 键值对(40多亿) 方法 hest key ...

  6. [置顶] Elon Musk (伊隆·马斯克):无限的创想与意志的胜利

    Elon Musk (伊隆·马斯克):无限的创想与意志的胜利 很多人说 Steve Jobs 很伟大,这一点我认同.但是,单纯从创造出的产物而言,Elon Musk 的成就毫无疑问远远超越 Steve ...

  7. python3 将两个列表生成一个字典

    需求: 存在两个list如下 list1 = ["one", "two", "three"] list2 = ["1", ...

  8. vue懒加载实现

  9. eclipse引入svn插件,并将项目同步到svn

    1. eclipse中不存在SVN问题的解决 1.1发现Team->Share project 下没有svn. 1.2下载安装svn插件. 选择help->Eclipse Marketpl ...

  10. myeclipse导入工程 Some projects cannot be imported because they already exist in the workspace

    问题描述: 1 第一次从外部导入工程或者新建工程,成功: 2 删除该工程,但是没有选择delete project contents on disk 3 再次需要该工程,导入该工程时出现警告:Some ...