题目链接 \(Description\) 有一棵树.Limak可以攻击树上的某棵子树,然后这棵子树上的每条边有\(\frac{1}{2}\)的概率消失.定义 若攻击以\(x\)为根的子树,高度\(ht(x)\)为\(x\)子树剩余点(与x连通)的最大深度.共\(q\)次操作,两种: \(1\ x\).新建一个节点,其父节点为\(x\). \(2\ x\).询问若攻击以\(x\)为根的子树,\(x\)子树的期望高度. \(q\leq 5\times10^5\).允许有一定精度误差. \(Solut…
题目链接 CF643E. Bear and Destroying Subtrees 题解 dp[i][j]表示以i为根的子树中,树高小于等于j的概率 转移就是dp[i][j] = 0.5 + 0.5 (dp[i][j-1]) 首先是边不连的概率,其次是<=dp[son][j -1]的 然后我zz了 对于新增一个点,对于父亲的深度影响只有该节点的深度+1,除掉旧的乘上新的就OK,我全更新了一遍...,写出了奇怪的bug... 对于新点,只需要向上更新60次就好了,因为\(\frac{1}{2^60…
E. Bear and Destroying Subtrees http://codeforces.com/problemset/problem/643/E 题意: Q个操作. 加点,在原来的树上加一个点,之后还是一棵树,初始时一个点. 让一棵子树内每条边有1/2的概率消失,然后的深度为:剩余的与子树的根联通的点中深度最大的.询问假如攻击这个点,期望深度. 分析: 可以枚举一个深度,计算概率. f[x][i]表示以x为根的子树中,深度为<=x的概率.那么答案就是$\sum_{h=1}^{MAX\…
CF643E Bear and Destroying Subtrees 设 \(f_{i,j}\) 表示节点 \(i\) 的子树深度为 \(\le j\) 的概率,\(ch_i\) 表示 \(i\) 的儿子节点集合. \(2^{-50}\) 以下的值由于精度忽视. \[f_{i,j}= \begin{cases} \frac{1}{2^{|ch_i|}}&(j=0)\\ \prod_{s\in ch_i}\frac{f_{s,j-1}+1}{2}&(j>0)\\ \end{cases…
Description: ​ 给你一棵初始只有根为1的树 ​ 两种操作 ​ 1 x 表示加入一个新点以 x为父亲 ​ 2 x 表示以 x 为根的子树期望最深深度 ​ 每条边都有 \(\frac{1}{2}\) 的概率断裂. Solution: \[ E(\max\{A\}) \not=\max\{E(A)\} \] ​ 所以一般会从定义出发,设 \(dp[x][i]\) 表示以 \(x\) 为根,深度为 \(i\) 的概率. ​ 然后不好确定这个深度是在哪取到,所以可以设 \(dp[x][i]\…
题解 我们可以先写出\(dp\)式来. 设\(dp[u][i]\)表示以\(u\)为根的子树深度不超过\(i-1\)的概率 \(dp[u][i]=\prod (dp[v][i-1]+1)*\frac{1}{2}\) 然后因为这道题精度要求比较低,所以我们对于每个\(u\),保留第二维60个就行了. 所以每次加入一个节点的时候,我们只需要更新父链上60个\(dp\)值就好了,复杂度\(O(n*60)\). 代码 #include<bits/stdc++.h> #define N 500002 u…
令$f_{i,j}$表示以$i$为根的子树中,深度小于等于$j$的概率,那么$ans_{i}=\sum_{j=1}^{dep}(f_{i,j}-f_{i,j-1})j$ 大约来估计一下$f_{i,j}$的大小,较坏情况下是$\lfloor\frac{n-1}{j}\rfloor$个深度为$j$的节点(若选择有公共部分,虽然会增加节点数但并实际边的数量减少),即可以认为$f_{i,j}\ge (1-\frac{1}{2^{j}})^{\lfloor\frac{n-1}{j}\rfloor}$ 其在…
题意: 一个由大写字母组成的长度为\(n(n \leq 75)\)的字符串,每次操作可以交换相邻位置的两个字母,求最少操作多少次使字符串中不出现子串VK 分析: VK之外的字母具体是什么,我们并不关心,所以可以统一设它们为X 设\(d(v,k,x,t)\)表示,已经确定前\(v\)个V,前\(k\)个K和前\(x\)个X为字符串的前\(v+k+x\)个字母,\(t\)取\(0\)或\(1\)表示第\(v+k+x\)个字母是否为V,最少需要操作多少次 在转移的时候可以选择后面的第\(v+1\)个V…
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和,这个sum数组在打素数表时候就能够求出来,注意一点求素数的内层循环要改成i.不能再写成i + i或者i * i了.原因想想就明确了. 这学期最后一场比赛也结束了,结果不非常惬意但也还好. 总的来说这学收获还是蛮多的. 近期可能就不再做ACM了吧,可能要复习CET6了吧,可能要复习期末考试的内容了吧.…
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX_N = 5000 + 100; char str[MAX_N]; struct Node…