(WC2018模拟十二)【FJOI2016集训Day7T2】点对游戏
题解:
还好。。。看懂题目就好做了。(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】点对游戏的更多相关文章
- (WC2018模拟十二)【FJOI2016集训Day7T1】挑选子序列
题解: 这题太神仙了,先咕着,放个令人****的官方题解(精确覆盖问题是NP完全问题啊摔) Dancing Link X学习资料:QAQ TAT qwq Orz Donald Knuth大神... p ...
- (WC2018模拟十二)【FJOI2016集训Day7T3】Xor-Mul棋盘
是不是应该第100篇博文纪念一下? 题解: 本质简单题...但是我没仔细看这题... 观察它的两个式子,都是xor完再乘以某个数,意味着d数组的每个二进制位对答案的贡献都是独立的,可以每一位分开处理. ...
- NOIp2018模拟赛四十二
今天看标题终于回到了“NOIP模拟赛”,十分高兴啊! 然后一打开题目: ********** 所以今天又是一场NOIPlus模拟赛(微笑) 成绩:0+70+0=70 A题想了个贪心被myh两分钟cha ...
- 第十二章Fundamental Data Types 基本数据类型
目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1 数值概论 ...
- 【腾讯Bugly干货分享】腾讯验证码的十二年
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581301b146dfb1456904df8d Dev Club 是一个交流移动 ...
- (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- Linux基础入门(新版)(实验九-实验十二)
实验九 简单文本入门 一.常用的文本处理命令 二.文本处理命令 1.tr 命令 tr 命令可以用来删除一段文本信息中的某些文字.或者将其进行转换. 使用方式: tr [option]...SET1 [ ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
随机推荐
- CorelDRAW设计制作超漂亮的3D立体字效果实例教程
第一.打上招聘两个字,选择一个喜欢的字体,如下. 第二.把字体转曲,等待下一步编辑曲线做好准备,如下. 第三.选择形状工具,编辑字体形状,根据自己需要可任意编辑,如下. 第四.适当画一些装饰素材,比如 ...
- ZBrush中Layer层笔刷介绍
本文我们来介绍ZBrush®中的Layer层笔刷,该笔刷是一种类似梯田效果的笔刷,常用来制作鳞甲和花纹图腾.他还可以用一个固定的数值抬高或降低模型的表面,当笔刷在重合时,笔画重叠部分不会再次位移,这使 ...
- 脚本_使用expect自动交互远程主机安装软件
#!bin/bash#功能:使用expect工具自动交互密码,远程到其它主机,安装httpd软件#作者:liusingbon#删除~/.ssh/known-hosts后,ssh远程任何主机,系统都会询 ...
- java简单实现MD5加密
1.话不多说,直接上代码-----传入字符串,返回加密码 import java.security.MessageDigest; import java.text.NumberFormat; publ ...
- 全文检索lucene6.1的检索方式
背景: 工作任务完成后,闲暇之计给自己充充电! Lucene是一个纯java全文检索工具包,采用倒排索引原理. 全文检索:指的是计算机索引程序通过扫描文章的每一个词,对每一个词建立一个索引,并指明该词 ...
- APICloud 上滑加载更多
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- logstash配置如何理解?
elasticsearch { action => "index" #The operation on ES hosts => "localhost: ...
- Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
Struts2,Spring,Hibernate是Java Web开发中最为常见的3种框架,掌握这3种框架是每个Java Web开发人员的基本功. 然而,很多初学者在集成这3个框架的时候,总是会遇到各 ...
- 洛谷——P1886 滑动窗口|| POJ——T2823 Sliding Window
https://www.luogu.org/problem/show?pid=1886#sub || http://poj.org/problem?id=2823 题目描述 现在有一堆数字共N个数字( ...
- ArcEngine 一些实现代码
转自原文 ArcEngine 一些实现代码 ●·● 目录: A1 …………实现:鼠标滑过显示要素 tip A2 …………实现:通过鼠标选择要素并高亮显示(ISelectionEnvironme ...