(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的简化版本 ...
随机推荐
- mybatis中if及concat函数的使用
- BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络
对于第一问,跑一遍最大流即可. 对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用. 跑一遍最小费用流即可. Code: #include <vecto ...
- Unity5.X 编辑器介绍
导航窗口中有一个 Add Asset Package 按钮,可以导入一些官方的资源包,例如Characters角色控制器 Windows → Layouts 可以更换窗口的摆放 常见视图 ...
- python位操作(进制)与ascii
位操作符 位操作的操作符与python的set的操作符一样.与C语言中的位操作符也是一样的. a = 60 #60的二进制为 0011 1100b = 13 #13的二进制为 00001101 c = ...
- NOI 2016 优秀的拆分 (后缀数组+差分)
题目大意:给你一个字符串,求所有子串的所有优秀拆分总和,优秀的拆分被定义为一个字符串可以被拆分成4个子串,形如$AABB$,其中$AA$相同,$BB$相同,$AB$也可以相同 作为一道国赛题,95分竟 ...
- Git 合并流程
首先把自己的代码提交到自己的分支 再把master[主分支]的代码拉下来更新 解决冲突 推送至自己的分支 请求合并到master[主分支]
- OO第三单元总结——JML规格设计
• 1.JML语言的理论基础.应用工具链情况 JML(Java Modeling Language)—— java建模语言,是一种行为接口规范语言( behavioral interface spec ...
- 洛谷 P1617 爱与愁的一千个伤心的理由
P1617 爱与愁的一千个伤心的理由 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. 题目描述 ...
- POJ 2888
思路挺清晰的.不过,我就是WA.不清楚为什么,很多数据都过了. 其实,一个置换后若有循环节个数为K,则N必定可以除以尽K.而K正好可以看成一个环.为什么呢?看前K个珠子,就是一个环,而后面的若干个K个 ...
- 为什么选性别会导致兴趣都选中-vue
为什么选性别会导致兴趣都选中-vue <%@ page language="java" import="java.util.*" pageEncoding ...