【UOJ 351】新年的叶子
其实原来看到这题是真的不想做的 毕竟真的特别怕期望题
后来莫名发现自己打了正解 也是很震惊的2333
Description
对于一棵树,每次随机染黑一个叶子(可能会重复染黑),期望多少次后直径变小
Solution
第一种R为偶数的情况时:找一个点root,所有的直径都经过这个root点,以此点为根
dpx=R/2的点可能是直径断点,先统计出来个数(x1),把所有dpx=R/2的点按他是root的哪一棵子树分成几个集合
直径改变了,当且仅当只剩下一个集合的点没有被删完。
第二种R为奇数的情况时:
把必经边分成两个集合,集合中的点为dpx=R/2(向下取整)把x1也一样的统计,就成了跟上述情况类似了
无关点可当做一开始就被删掉了,所以再删掉一个没被删的点的代价就是全部叶子数/还剩的点的个数
问题转化成:每删除一个剩下的点,求删剩一个集合的期望值
#include <bits/stdc++.h>
#define N 500010
#define Mo 998244353
using namespace std;
long long n,m,ans,jc[N],jcn[N],sum[N];
long long edge[N*][],e1[N];
long long a[N],f[N],t;
long long X,maxx,X1,d[N],x1,cnt;
inline long long ksm(long long b,long long p);
inline void init(){
for (register long long i=;i<=n;++i)
jc[i]=jc[i-]*(long long)i%Mo;
jcn[n]=ksm(jc[n],Mo-);
for (register long long i=n-;i>=;--i)
jcn[i]=jcn[i+]*(i+1LL)%Mo;
}
inline long long read(){
char ch=' ';long long x=,y=;
for(;(ch!='-')&&((ch<'')||(ch>''));ch=getchar());
if(ch=='-')y=-,ch=getchar();
for(;ch>='' && ch<='';ch=getchar())x=x*+ch-;
x=x*y;
return x;
}
inline void Build(long long x,long long y){
++a[x];++a[y];
edge[++cnt][]=e1[x];
edge[cnt][]=y;
e1[x]=cnt;
edge[++cnt][]=e1[y];
edge[cnt][]=x;
e1[y]=cnt;
}
inline long long ksm(long long b,long long p){
long long a=b,c=p,ans=;
while(p>){
if(p-p/*!=) ans=(ans*b)%Mo;
b=(b*b)%Mo,p=p>>;
}
return ans;
}
inline long long calc(long long m,long long n){return jc[m]*jcn[m-n]%Mo*jcn[n]%Mo;}
void dfs(long long x,long long s,long long father){
long long max1=,t=,g;
for(register long long i=e1[x];i;i=edge[i][])
if(edge[i][]!=father&&f[edge[i][]]+>s)
t=s,s=f[edge[i][]]+,max1=edge[i][];
else if(edge[i][]!=father&&f[edge[i][]]+>t)
t=f[edge[i][]]+;
if (s+t>ans) ans=s+t;
if (maxx>=s){
if (maxx>s) X=x; else X1=x;
maxx=s;
}
for(register long long i=e1[x];i;i=edge[i][])
if(edge[i][]!=father){
if (max1==edge[i][])
g=t+;
else g=s+;
dfs(edge[i][],g,x);
}
}
long long dfs1(long long x,long long y,long long father){
long long ans=(!y);
for(long long i=e1[x];i;i=edge[i][])
if(edge[i][]!=father)
ans+=dfs1(edge[i][],y-,x);
return ans;
}
void dfs2(long long x,long long father){
f[x]=;
for(long long i=e1[x];i;i=edge[i][])
if(edge[i][]!=father)
dfs2(edge[i][],x),f[x]=max(f[x],f[edge[i][]]+);
x1+=(a[x]==?:);
}
inline long long answer(long long m,long long m1){
long long ans=,ans1=,t=;
for (int i=m;i>=;i--)
sum[i]=(sum[i+]+m1*ksm(i,Mo-))%Mo;
for (int j=;j<=d[];++j)
for (int i=;i<=d[j]-;++i){
ans=(ans+(calc(d[j],i)*jc[m-d[j]+i-]%Mo*(m-d[j])%Mo)*sum[d[j]-i+]%Mo*jc[d[j]-i])%Mo;
ans1=(ans1+(calc(d[j],i)*jc[m-d[j]+i-]%Mo*(m-d[j])%Mo))%Mo;
}
return ans*jcn[m]%Mo;
}
int main(){
n=read(),jc[]=,maxx=1e9,t=;
for (register long long i=;i<=n-;++i)
Build(read(),read());
init();
dfs2(,);
dfs(,,);
if (ans&){
d[]=;d[]=dfs1(X,ans/,X1);d[]=dfs1(X1,ans/,X);
printf("%lld\n",answer(d[]+d[],x1));
}
else{
for(register long long i=e1[X];i;i=edge[i][])
t+=(d[++d[]]=dfs1(edge[i][],ans/-,X));
printf("%lld\n",answer(t,x1));
}
return ;
}
【UOJ 351】新年的叶子的更多相关文章
- [UOJ#351]新年的叶子
[UOJ#351]新年的叶子 试题描述 躲过了AlphaGo 之后,你躲在 SingleDog 的长毛里,和它们一起来到了AlphaGo 的家.此时你们才突然发现,AlphaGo 的家居然是一个隐藏在 ...
- UOJ#351. 新年的叶子 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 题目传送门 - UOJ351 题意 有一个 n 个节点的树,每次涂黑一个叶子节点(度为 1 ...
- uoj#351. 新年的叶子(概率期望)
传送门 数学还是太差了,想了半天都没想出来 首先有一个定理,如果直径(这里考虑经过的点数)为奇数,所有直径有同一个中点,如果直径为偶数,所有直径有同一条最中间的边.这个可以用反证法,假设不成立的话直径 ...
- 「UOJ351」新年的叶子
「UOJ351」新年的叶子 题目描述 有一棵大小为 \(n\) 的树,每次随机将一个叶子染黑,可以重复染,问期望染多少次后树的直径会缩小. \(1 \leq n \leq 5 \times 10^5\ ...
- 【UOJ #351】新年的叶子(树的直径,期望)
题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ...
- uoj#67. 新年的毒瘤(割顶)
#67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结 ...
- uoj 67 新年的毒瘤 tarjan求割点
#67. 新年的毒瘤 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 辞旧迎新之际 ...
- uoj 66 新年的巧克力棒 数学
#66. 新年的巧克力棒 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/66 Description 马上就要 ...
- UOJ#67. 新年的毒瘤
传送门 练习一下Tarjan的模板. 求一下割点,然后加个约束条件判一下特殊点,剩下的就是所求点. //UOJ 67 //by Cydiater //2016.10.27 #include <i ...
随机推荐
- java从request中获取GET和POST请求参数
URL和参数列表 一 获取请求方式 request.getMethod(); get和post都可用, 二 获取请求类型 request.getContentType(); get和post都可用,示 ...
- Django--CRM--菜单排序等
一 . 菜单排序 1.我们想把菜单排序.首先给菜单加上权重,权重大的排在上面, 这就要在菜单表上加上一个权重字段. 2. 我们在菜单表里面把权重改一下 3. 需要把权重字段的信息拿出来放到sessio ...
- python学习笔记(11)--测验3: Python基础语法(下) (第7周)
斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波 ...
- 集合之ArrayList(含JDK1.8源码分析)
一.ArrayList的数据结构 ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据.我们对ArrayList类的实例的所有的操作(增删改查等),其底层都 ...
- linux操作命令 开发人员需要掌握的一些命令
1.man 查看帮助 2.命令 --help 简单帮助 3.help cd 查看一些Linux 命令行的一些内置命令 4.cp 粘贴复制命令 eg:cp yum.log /root/ 5.find ...
- Python——FTP上传和下载
一.FTP对象方法说明 login(user='anonymous',passwd='', acct='') 登录 FTP 服务器,所有参数都是可选的 pwd() 获得当前工作目录 cwd(path) ...
- LODOP打印控件进行批量打印
Lodop打印控件批量打印的方式:1.批量打印每页内容相同的:(1)批量打印相同内容的很多纸张,可以设置打印份数,把该内容打印出多份.2.批量打印每页不同内容的:(1)通过在一个任务中分页,循环添加页 ...
- How to create ISO on macOS
hdiutil makehybrid -iso -joliet -o test1.iso /users/test/test1
- How to proof RSA
欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...
- JavaScript简单简介
JavaScript,男,web页面的一种脚本编程语言,1955年诞生,妻子为HTML,魔法能力是将静态页面(经过与用户交互与相应)转变为动态页面. 刚进入浏览器市场(魔界)的时候,也就是js1.0岁 ...