BZOJ5305: [HAOI2018]苹果树】的更多相关文章

每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚举左右子树大小,则有f[n]=Σ{[f[i]+(g[i]+h[i]*i)·(n-i)]·h[n-i-1]+[f[n-i-1]+(g[n-i-1]+h[n-i-1]*(n-i-1))·(i+1)]·h[i]}·C(n-1,i),即对两棵子树分别统计贡献,C(n-1,i)即给左右子树分配编号.g[n]=…
题目链接 BZOJ5305 题解 妙啊 要求的是所有可能的树形的所有点对距离和 直接考虑点的贡献肯定想不出,这样的所有点对距离问题通常转化为边的贡献 考虑一条边会产生多少贡献 我们枚举\(i\)节点的父亲边 首先我们认识到一点,按照题中所给的生成树的方式,\(n\)个节点的树有\(n!\)种形态 我们枚举了边,贡献为边两侧点数之积,所以再枚举一下\(i\)子树大小\(siz\) 那么贡献为 \[siz(n - siz)\] \(i\)子树的方案数为 \[{n - i \choose siz -…
首先注意到每种树都是等概率出现的,于是将问题转化成计数求和问题. f[n]表示所有n个点的树的两两点距离和的总和. g[n]表示所有n个点的树的所有点到根的距离和的总和. h[n]表示n个点的树的可能形态数. 转移: f[n]+={[f[i]+(g[i]+h[i]*i)·(n-i)]·h[n-i-1]+[f[n-i-1]+(g[n-i-1]+h[n-i-1]*(n-i-1))·(i+1)]·h[i]}·C(n-1,i) g[n]+=[(g[i]+h[i]*i)·h[n-i-1]+(g[n-i-1…
题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, 果树会随机选择一个当前树中没有长出过结点 的分支, 然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边. 小 C 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间 的距离定义为从一个点走到另一个点的路径经过的边数. 现在他非常好奇, 如果 NNN 天之后小…
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, 果树会随机选择一个当前树中没有长出过结点 的分支, 然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边. 小 C 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间 的距离定义为从一个点走到另一个点的路径经过的边数. 现在他非常好奇, 如果 \(N\) 天之后小…
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, 果树会随机选择一个当前树中没有长出过结点的分支, 然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边. 小 \(C\) 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间 的距离定义为从一个点走到另一个点的路径经过的边数.…
传送门 果然只有我这种菜鸡才会用这种菜鸡做法QwQ 对于一类要求期望的题目,有一个无脑的做法: 设概率为 \(f\),期望为 \(g\) 每次合并两个二元组 \(<f_1,g_1>,<f_2,g_2>\) 的方法显然为 \(<f_1\times f_2,g_1\times f_2+f_1\times g_2>\) 对于这一道题,设 \(i\) 个点的树的方案数 \(f_i\),到根的距离和为 \(g_i\),距离总合 \(h_i\) 显然 \(f_i=i!\) (我TM…
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大小为\(K\)的子树的话,考虑方案数. 首先要从剩下的\(n-u\)个点中选出\(K\)个点作为这棵子树,那么选择方案数是\({n-u\choose K}\),构树的方案数是\(K!\).除了这些点外,还剩下\(n-u-K\)个点,他们随意的方案数我们这样考虑,首先把选出来的\(K\)个点拿出来,余…
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, 果树会随机选择一个当前树中没有长出过结点 的分支, 然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边. 小 C 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间…
[HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到换一种思路,算每一条边有多少对点经过,很自然的想到状态\(dp[i][j]\)表示树标号到i,i子树的节点sz大小为j.这题是有标号的,先考虑无标号,那么i子树的形态一共有\(j!\)种. i之上的树的形态(有先后顺序区别)有多少怎么算呢?已经到i了,说明前i个节点的形态已经确定,有\(i!\)种形…
题目分析: 思路不难想,考虑三个dp状态$f,g,d$. $g[i]$表示有$i$个点的堆的数量 $d[i]$表示有$i$个点的情况下所有的方案数中点到根的距离和 $f[i]$表示要求的答案. 不难发现$g[i]=i!$,然后$d[i]$就枚举左子树大小,然后把左右子树单独的$d[j]$加起来,最后对于每种方案都加上$i-1$,也就是$d[i] = g[i]*(i-1)+\sum_{j=0}^{i-1}\binom{i-1}{j}*(d[j]*g[i-j-1]+d[i-j-1]*g[j])$.…
题解 首先所有生成树的情况树是\(n!\)的,因为第一次有1中方法,第二次有两种放法,以此类推... 然后我们发现距离这种东西可以直接枚举每条边算贡献. 于是我们枚举了一个点\(i\),又枚举了这个点的子树大小\(size\),那么这部分的距离也就可以直接算出来了. \[ (n-size)*size \] 接下来我们还要去算有多少种方案. 对于子树内部,标号和排列方法都没有确定,所以方案数就是: \[ \binom{n-i}{size}*size! \] 然后考虑子树外的情况,首先子树外的点不可…
LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二叉树有\(n!\)种.(一个二叉树的中序遍历是唯一的,有\(n!\)种,也可以得到这个结论) \(Sol1\) 考虑对每条边两边的点集计算贡献.即设一条边一边有\(size\)个点,另一边有\(n-size\)个点,那么它的贡献是\(size(n-size)\). 直接把边放到点上,枚举每个点\(i…
题意 题目链接 Sol 有点自闭,.我好像对组合数一窍不通(~~~~) Orz shadowice // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long long int mod; template<typename A, typename B> inline bool chmax(A &x, B y) {return x < y ? x = y, 1 : 0;} template<t…
嘟嘟嘟 这种计数大题就留给南方的计数神仙们做吧-- 刚开始我一直想枚举点,考虑新加一个点在根节点的左右子树,以及左右子树大小怎么分配,但是这样太难计算新的点带来的贡献了. 后来lba又提示我枚举边,考虑每一条边的贡献. 这确实是一个好主意,枚举边的同时考虑边两侧的点数,但可怕的是我一直把他当成无根树来做,也就是忽略了树上打父子关系,导致少算了好多形态. 于是题解吵朝我挥了挥手. 既然是有根树,那么我们枚举每一个点,然后枚举的是这个点和他父亲的连边,这样就能不重不漏并且有顺序的枚举所有边了. 考虑…
题面 统计贡献,每个大小为i的子树贡献就是$i(n-i)$,然后子树里又有$i!$种:同时这个子树的根不确定,再枚举这个根是$r$个放的,又有了$r!$种.子树内选点的方式因为子树的根被钦定了顺序所以只有一个组合数,子树外面的则是一个连乘积.答案就是 $i(n-i)i!r!C_{n-r}^{i-1}\prod\limits_{j=r-1}^{n-i-1}j$ $=(r-1)r*i*i!*(n-i)!$ #include<cstdio> #include<cstring> #incl…
思路 题目要求的其实就是每种方案的权值之和(因为每种方案的概率相等) 所以自然想到要求所有的边对最终答案的贡献次数 考虑这一条边被经过了多少次,有这个子树内的点数*子树外的点数次,即\(k\times(n-k)\) 然后考虑总共的中序遍历总共有\(n!\)种,每种方案等概率 先钦定一个点\(i\)(乘上\(i!\)),然后枚举它的\(sz\),这样相当于枚举了每种生成的树的形态,做到了不重不漏 对于这个点\(i\),考虑选择K个点作为它的子树进行统计(\(sz_i=K+1\)),然后选择的k个点…
首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\(i!\))的值 令\(g_i\)表示\(i\)个节点的子树,期望两两路径之和(乘\(i!\))的值 那么\(f_i = i * i! + \sum \limits_{L = 0}^{i - 1} \binom{i - 1}{L} (f_L * R! + f_R * L!)\),\(L, R\)分别表…
https://www.luogu.org/problemnew/show/P4492 找每个编号的点的父边的贡献,组合数和阶乘就能算了. 我考场上怎么就是没想到呢. 调了好久好久好久好久调不出来,样例一直过不了,刚刚发现是乘的时候没有%好溢出了,我是个zz. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> usin…
Description Solution \(n\) 个点的二叉树的方案数是 \(n!\) 证明十分显然:新加入的点占掉了 \(1\) 个位置,新加了 \(2\) 个位置,那么多出来一个位置,所以第 \(i\) 个点有 \(i\) 种放法 考虑每条边被经过的次数,设子树大小为 \(size\),就是 \(size*(n-size)\) 以此考虑每个点父边被经过的次数,枚举子树大小 然后贡献就是子树内部形态的方案数乘以外部形态的方案数 内部的显然就是 \(size!\) , 但是编号还不确定,所以…
一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const int N=2007; int n,mod; int C[N][N],fac[N],g[N],f[N]; void Init() { fac[0]=C[0][0]=1; for(in…
题目链接 大意:不解释 思路: 首先方案数共有n!种,第1个点只有1种选择,第2个点2种选择,生成2个选择的同时消耗一个,第3个点则有3种选择,依次类推共有n!种方案,由于最后答案*n!,故输出的实际上是每种方案的总和. 由于枚举方案是不可行的,考虑枚举边,计算每一个点连向父亲的边的贡献,容易知道贡献为siz*(n-siz),siz为子树大小.所以枚举点与siz即可.再考虑组成子树的形态,与子树外的形态.设当前枚举到i号点,子树大小为siz,则子树内不考虑编号有siz!种形态,考虑编号则有C(n…
首先有个很奇妙而且很有用的性质:每个二叉树对应唯一的中序遍历,然后每个二叉树出现概率相同.所以n个节点的二叉树形态是n!种(题目中说了*n!已经是提示了),对每种方案求和即可得到期望.令f[i]表示i个节点的子树,根深度为1时,所有点的期望深度之和乘i!的值,令g[i]表示i个节点的子树,期望两两路径之和乘i!的值. 然后得到f[i]=i*i!+ΣC(i-1,L)(f[L]*R!+f[R]*L!),g[i]=ΣC(i-1,L)(g[L]*R!+g[R]*L!+f[L]*R!*(R+1)+f[R]…
考虑生成一颗二叉树的过程,加入第一个节点方案数为\(1\),加入第二个节点方案数为\(2\),加入第三个节点方案数为\(3\),发现生成一颗\(n\)个节点的二叉树的方案数为\(n!\). 所以题目中所求即为点与点之间的距离之和,考虑每一条边的贡献,即\(\sum\limits_esize_x \times size_y\),\(x\)和\(y\)为这条边的两个端点. 可以枚举每一个节点\(i\),再枚举节点\(i\)子树大小\(j\),其和父亲的连边对答案的贡献为\(j(n-j)\),然后贡献…
对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \(1*n\) 的格子上掷色子,从 \(0\) 点出发,掷了多少前进几步,同时有些格点直接相连,即若 \(a\) ,\(b\) 相连,当落到 \(a\) 点时直接飞向 \(b\) 点.求走到 \(n\) 或超出 \(n\) 期望掷色子次数 \(n \leq 100000\) Solution 这道题目有…
去冬令营转了一圈发现自己比别人差根源在于刷题少,见过的套路少(>ω<) 于是闲来无事把历年省选题做了一些 链接放的都是洛谷的,bz偷懒放的也是链接 AM.T1 奇怪的背包 Problem HAOI-2018奇怪的背包 Solution 暴力 \(60\),加上送的 \(10\) 有 \(70\) ,暴力进队 首先在模意义下倍数能表达的东西--裴蜀定理!即 \(\{kx\bmod p\}=\{k\cdot \gcd(x,p)\bmod p\}\),所以输入的 \(V_i\) 可以先与 \(P\)…
题解: 题目相对其他省难一点 不过弱省省选知识点都这么集中的么.. 4道数学题... 1.[HAOI2018]奇怪的背包 这题考场做就gg了... 其实我想到了那个性质.. 就是这个一定要是gcd的倍数 但是我傻逼的觉得这个不对.. 因为xi都要>=0 然后就看题解.. 仔细想了一下 这可是模意义下啊?? 你要是负数你一直加p答案不是不变的么... 然后有了这个性质我们考虑dp 直接$f[i][j]$表示考虑了前i个数,gcd为j这个复杂度比较gg 我们发现j一定是p的因数,所以离散化一下(ha…
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf\)的题目,以及\(loj\)上的一些省的集训题目,还有\(uoj\)的各种\(round\)的题目. 大块大块的做题记录就在这里记录一下,省选后再来看结果,至少努力过就不曾后悔了不是吗? 首先先是省选题的记录,然后有比赛的记录,做到每周至少完成一整场\(CF\)或者\(AtCoder\)比赛的题解…
目录 动态规划 序列DP 背包问题 状态压缩以及拆分数 期望概率DP 马尔可夫过程 一类生成树计数问题 平方计数 动态规划 序列DP 有些问题: 求长度为\(l\)的上升子序列个数 形如一个值域的前缀和的形式,还要支持插入,所以可以用树状数组优化DP,\(O(n^2logn)\)求解([BZOJ4361]isn) ​ 求最长上升子序列长度 两种做法,前者拓展性更强 设\(f[i]\)表示到第\(i\)个位置的最长上升子序列长度,则\(f[i]=max(f[j]+1),j<=i\&\&…
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noip前的杂题训练,我也很无奈啊 做完了的扔最后,欢迎好题推荐 这么多题肯定是完不成了,能多做一道是一道吧 DP yyb真是强得不要不要的辣:http://www.cnblogs.com/cjyyb/category/1036536.html [ ] [SDOI2010]地精部落 https://www…