首页 > 其他分享 >Tree Array

Tree Array

时间:2022-11-25 19:47:28浏览次数:41  
标签:tmp return int res Tree dep Array

Tree Array

一道简单但有趣的期望\(DP\),套路的,先枚举一个根,再计算答案。考虑到我只想知道 \(i < j\)且\(time_i > time_j\) 的个数,不妨枚举\(i, j\),计算\(i\)后出现的概率,求和即为答案。
对于\(i,j\),我们只关心他们的相对出现时间,那么对此有影响的便是\(LCA_{i,j}\)下方的点。设\(f_{x,y}\)表示\(i\)到\(lca\)间有\(x\)个点,\(j\)到\(lca\)间有\(y\)个点,使得\(i\)先出现的概率。因为对于每个点出现的概率是相同的,所以\(f_{x,y} = \frac{f_{x - 1,y} + f_{x, y - 1}}{2}\),初值为\(f_{0,i} = 1\)。总时间复杂度为\(O(n^3logn)\)。

Code
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 205, P = 1e9 + 7;
int h[N], tot, n, g[N][N], f[N][15], dep[N];

struct edge{int to, nxt;}e[N << 1];
void add(int x, int y){e[++tot] = edge{y, h[x]}, h[x] = tot;}
LL fpow(LL x, LL y) { 
	LL res = 1;
	for (; x; x >>= 1, y = y * y % P)
		if (x & 1) res = res * y % P;
	return res;
}
void dfs(int u, int fa) {
	dep[u] = dep[fa] + 1, f[u][0] = fa;
	for (int i = 1; i <= 10; i++) f[u][i] = f[f[u][i - 1]][i - 1];
	for (int i = h[u]; i; i = e[i].nxt)
		if (e[i].to ^ fa) dfs(e[i].to, u);
}
int lca(int x, int y) {
	if (dep[x] > dep[y]) swap(x, y);
	int tmp = dep[y] - dep[x];
	for (int i = 0; tmp; tmp >>= 1, i++) (tmp & 1) && (y = f[y][i]);
	if (x == y) return dep[x];
	for (int i = 10; i >= 0; i--) (f[x][i] ^ f[y][i]) && (x = f[x][i], y = f[y][i]);
	return dep[f[x][0]];
}
int main() {
	scanf("%d",&n);
	for (int i = 1, q, p; i < n; i++) scanf("%d%d",&q,&p), add(q, p), add(p, q);
	for (int i = 1; i <= n; i++) g[0][i] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			g[i][j] = (g[i - 1][j] + g[i][j - 1]) * fpow(P - 2, 2LL) % P;
	LL ans = 0;
	for (int i = 1; i <= n; i++) {
		dfs(i, 0);
		for (int j = 1; j <= n; j++)
			for (int k = j + 1, x; k <= n; k++)
				x = lca(j, k), (ans += g[dep[k] - x][dep[j] - x]) %= P;	
	}
	printf("%lld\n", ans * fpow(P - 2, (LL)n) % P);
}

标签:tmp,return,int,res,Tree,dep,Array
From: https://www.cnblogs.com/nibabadeboke/p/16926170.html

相关文章

  • ArrayList 与linkedlist区别
    ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。LinkedList使用了循环双......
  • Java中List同ArrayList有什么不同呢?
    转自:http://www.java265.com/JavaProblem/202110/1415.html下文笔者讲述使用java代码常见的List和ArrayList的不同之处,如下所示:不同之处:一、两者压根都不是一个......
  • Java ArrayList移除元素相关
    @TestpublicvoidtestList(){List<String>list=newArrayList<>();list.add("1");list.add("2");for(Strings:lis......
  • CF1707D Partial Virtual Trees
    首先真子集这一限制比较麻烦,我们可以尝试把这个限制给去除掉。具体地,令\(G(i)\)表示答案,\(F(i)\)为用\(i\)步使得\(U={1}\)且不要求真子集这一限制的方案数。考虑......
  • Java: Arrays
    AnarrayofstringsString[]cars={"Volvo","BMW","Ford","Mazda"};Anarrayofintegersint[]myNum={10,20,30,40};ChangeanArrayElementString......
  • npm安装antdpro出现npm ERR! ERESOLVE unable to resolve dependency tree
    npmi@ant-design/pro-cli-gprocreatemyapp?......
  • CF1656E Equal Tree Sums Sol
    可以用归纳法解题。首先发现,删掉一个点,剩下的块数就是它的度数。不妨使得\(\suma_i=0\),一个点的点权等于其他所有点权的和的相反数。发现度数是相互提供的,则相邻的点......
  • jsTree使用
    jsTree可以显示一个树状视图,支持复选框选中,选中触发事件等:其中主要用到的方法有:1.设置数据:这里的data一般是ajax请求服务器返回的,必须要有id,parent,text这三个字段用于显......
  • 说一下 ArrayDeque 和 LinkedList 的区别?
    大家好,我是小彭。在上一篇文章里,我们聊到了基于链表的Queue和Stack实现——LinkedList。那么Java中有没有基于数组的Queue和Stack实现呢?今天我们就来聊聊这个......
  • java LinkedList , ArrayDeque, ArrayList区别
    linkedlist  既实现了 list接口,又实现了 queue,deque接口, 底层用链表数据结构,便于增删元素和顺序迭代arraydeque 实现了 queue和deque接口,底层用数组实......