首页 > 其他分享 >2022CCPC广州I题

2022CCPC广州I题

时间:2023-11-05 13:11:42浏览次数:33  
标签:广州 结点 2022CCPC int 感染 div 节点 号点

\(CCPC2022\)广州\(I\)
这是一道和队友\(vp\)时我没有出的\(dp\)题目,说明我的\(dp\)还有很多空缺,加练!
题意
一种高度繁殖的细菌感染了一棵由 \(n\) 个节点(有 \(n-1\)条边,无循环)组成的树。这些节点的索引从 \(1\)到 \(n\)。
一开始正好有一个节点被感染。树上的每个节点都有一个初始易感性权重 \(a_i\),表示节点\(i\)有 \(\dfrac{a_i}{\sum_{i=1}^{n}a_i}\)的概率成为树的初始感染节点。
此外,每个节点都有一个感染概率 \(p_i\),表示其被相邻节点感染的概率。
具体来说,从初始感染节点开始,如果一个节点被感染,与其相邻的未感染节点 \(x\)将有概率 \(p_x\)成为新的感染节点,然后 \(x\)可以继续感染其相邻节点。
现在,您的任务是计算恰好有 \(k\)个节点最终被感染的概率。你需要为每个 \(k=1,\ldots, n\)输出一个答案。
如果答案是 \(\frac{a}{b}\)( \(\gcd(a,b)=1\)),则需要输出 \(a\cdot b^{-1}\bmod{10^9+7}\),其中 \(b\cdot b^{-1} \equiv 1 \pmod{10^9+7}\)。

题解
如果对于一个根结点,我们去考虑它下面的点分别要设计多少个点被传染,那么我们就还需要考虑它的下面的下面的结点设计多少个结点被感染,这样子的做法无疑是非常差的做法,而且肯定超时。
那么,遇到这类求所有情况的题目,我们可以采用树上背包的思想来考虑这道题,甚至不需要换根。
首先,我们对于一个图来进行讨论,不妨就用样例好了。
image

对于我们的\(2\)号点,假如它先遍历到了\(3\)号点,那么我们先计算答案,再把\(3\)号结点下面的节点数加给\(2\)号结点
在遍历到\(3\)号点之前,以\(2\)号点为根的子树结点只有自己,以\(3\)为根的子树下面结点数为\(2\)
设计状态
那么我们可以考虑两种状态,
第一种,目前状态下(就是说这个点下面的结点不一定统计完了)\(3\)号点里面有\(i\)个传染点,且没有感染源
第二种,目前状态下(就是说这个点下面的结点不一定统计完了)\(3\)号点里面有\(i\)个传染点,且有传染源
那么,我们可以设立两个状态数组\(f[i][j]\)和\(g[i][j]\),\(f\)表示第一种状态,\(g\)则表示第二种状态
其次,我们再建立一个计数数组\(siz[i]\),表示目前状态下此时\(i\)号点为根的树的结点个数
初始状态
\(f[u][1] = a[u] * invb[u]\)
\(g[u][1] = p[u]*inv\)
状态转移(满足乘法原理)
现在再回到题目,我们先讨论\(2\)号点当前状态:

  1. 没有感染源
    \(f[2][1] = f[3][1] * f[2][0] + f[3][0] * f[2][1]\)
    \(f[2][2] = f[3][1] * f[2][1] + f[3][2] * f[2][0] + f[3][0] * f[2][2]\)
    你会发现,可能会出现计算错误的情况,所以我们需要两个中转数组记录答案,再转移
    \(f[u][v] = \sum_{div}^{u}(f[u][i]*f[div][j]),(i + j =v,div\in u)\)
  2. 有感染源
    \(g[2][1] = (g[2][1] * f[3][0] + f[2][1] * g[3][0]) + (g[2][0] * f[3][1] + f[2][0] * g[3][1])\)
    \(g[2][2] = (g[2][1] * f[3][1] + f[2][1] * g[3][1]) + (g[3][2] * f[2][0] + f[3][2] * g[2][0]) + (g[3][0] * f[2][2] + f[3][0] * g[2][2])\)
    因为其中一个里面有感染源,但是不确定是哪棵树的,所以我们分情况讨论
    \(g[u][v] = \sum_{div}^{u}(f[u][i] * g[div][j] + g[u][i]*f[div][j]),(i + j = v,div\in u)\)
    结合答案
    我们的答案要求输出所有的情况,所以,我们需要将最后结果统计到\(res\)数组中,假设我们现在遍历到\(u\)结点,它的父亲是\(fa\)
    \(res[i] = res[i] + g[u][i] * (1 - a[fa] * invb[fa]);\)
    传染源和感染病毒都在\(u\)号点为根的树中,那么它的父节点必不可能是传染源,那么将父亲不被传染的概率乘上\(g[u][i]\)即可,这也是不需要换根的奥妙,我们将感染源限制住了。
    代码实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int P = 1e9 + 7;
const int N = 2010;
//存图
int ne[N << 1], e[N << 1], h[N << 1], idx;
//上面解释过了
int f[N][N], g[N][N], siz[N], res[N];
//中转数组
int t1[N], t2[N];
//预处理变量
int p[N], a[N], b[N], inva[N], invb[N], inv, sum;
int n, m;

void add(int x, int y) {
	ne[idx] = h[x], e[idx] = y, h[x] = idx++;
}

int qmi(int x, int k, int p) {
	int res = 1;
	while(k) {
		if(k & 1) res = res * x % p;
		x = x * x % p;
		k >>= 1;
	}
	return res;
}

void dfs(int u, int fa) {
    //初始化
	siz[u] = 1;
	f[u][1] = a[u] * invb[u] % P;
	g[u][1] = p[u] * inv % P;
	
	for(int i = h[u];i != -1;i = ne[i]) {
		int div = e[i];
		if(div == fa) continue;
		dfs(div, u);
		//记录数组
		memset(t1, 0, sizeof(t1));
		memset(t2, 0, sizeof(t2));
        //树上背包
		for(int j = siz[u] + siz[div];j >= 0;j--) {
			for(int k = max(0ll, j - siz[u]);k <= min(j, siz[div]);k++) {
				t1[j] = (t1[j] + f[u][j - k] * f[div][k] % P) % P;
				t2[j] = (t2[j] + g[u][j - k] * f[div][k] % P + f[u][j - k] * g[div][k] % P) % P;
			}
		}
		siz[u] += siz[div];
        //记录答案
		for(int i = 0;i <= siz[u];i++) {
			f[u][i] = t1[i];
			g[u][i] = t2[i];
		}
	}
    //上面遍历可能会改变这个值,我们重新赋值即可
	f[u][0] = (1 - a[u] * invb[u] % P + P) % P;
    //计算全部概率
	if(u != 1) {
        //其他点有父结点
		for(int i = 1;i <= n;i++) {
			res[i] = (res[i] + g[u][i] * (1 - a[fa] * invb[fa] % P) % P) % P;
		}
	}
	else {
        //1号点没有父节点
		for(int i = 1;i <= n;i++) {
			res[i] = (res[i] + g[u][i]) % P;
		}
	}
}

void solve() {
	cin >> n;
	memset(h, -1, sizeof(h));
	for(int i = 1;i < n;i++) {
		int x, y;
		cin >> x >> y;
		add(x, y), add(y, x);
	}
    //预处理
	for(int i = 1;i <= n;i++) {
		cin >> p[i] >> a[i] >> b[i];
		sum += p[i];
		inva[i] = qmi(a[i], P - 2, P);
		invb[i] = qmi(b[i], P - 2, P);
	}
	inv = qmi(sum, P - 2, P);
    
	dfs(1, 0);
	for(int i = 1;i <= n;i++) cout << (res[i] + P) % P << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	int T = 1;
	while(T -- ) {
		solve();
	}
	return 0;
}

标签:广州,结点,2022CCPC,int,感染,div,节点,号点
From: https://www.cnblogs.com/xyfxyac/p/17810423.html

相关文章

  • 2023第四季北京/上海/广州/深圳DAMA-CDGA/CDGP数据治理认证报名
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 记录在广州两个月的Android面试插曲和感想
    前言一晃眼9月份了,入职快两个月闲着才想着写一份面经,从今年4月份离的职,中间休息加上学习一个半月(好不容易有闲时间就有些懈怠了)剩下一个半月的时间,通过内推+BOSS直聘,前前后后约到了10几家面试,终于拿到了一个满意的offer,仍然是一家做海外APP的公司。离职上家公司位于广州天河区,是一......
  • 【山河壮美,同贺双节】广州流辰信息祝大家中秋、国庆节快乐!
    金秋送爽,瓜果飘香,2023年,我们迎来了中秋、国庆双节碰撞的美好节日,每一个华人内心兴奋又激动。中秋花好月圆夜,国庆普天同庆时;八月十五桂花香,花团锦簇国运昌。在双节同庆的激动时刻,广州流辰信息将与广大华夏儿女一起祝愿每一个家庭家和万事兴,顺风又顺水;祝福美丽祖国繁荣昌盛;祝愿大家......
  • 2023年9月上海/杭州/广州/深圳DAMA-CDGA/CDGP数据治理认证报名
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 基于Xines广州星嵌OMAPL138 DSP+ARM+FPGA无人机避障系统
    基于Xines广州星嵌OMAPL138 DSP+ARM+FPAGA硬件平台、毫米波雷达平台以及大疆的无人机平台,开发了一套将毫米波雷达与单目视觉相融合的无人机自主避障演示系统;并利用该无人机自主避障演示系统做了避障飞行实验,初步验证了融合方案在无人机自主避障飞行中的可行性。    ......
  • Xines广州星嵌全新FPGA开发板—OMAPL138/C6748 DSP+ARM+FPGA
    1  开发板简介    XQ138F-EVM是一款基于广州星嵌TIOMAP-L138(浮点DSPC6748+ARM9)+XilinxSpartan-6FPGA核心板SOM-XQ138F设计的开发板,它为用户提供了SOM-XQ138F核心板的测试平台,用于快速评估SOM-XQ138F核心板的整体性能。 XQ138F-EVM底板采用沉金无铅工艺的四层板设计......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite (2022CCPC绵阳)ACG
    2022ChinaCollegiateProgrammingContest(CCPC)MianyangOnsite(2022CCPC绵阳)ACGHMhttps://codeforces.com/gym/104065昨天女队vp了一下,赛时4题223罚时A是一个dp,学妹已经写的差不多了,就是转移方向错了(给点时间应该能d出来)牛的牛的。我就看了点签到,又是作为蟑螂乱爬的一天......
  • Xines广州星嵌全新FPGA开发板—OMAPL138/C6748 DSP+ARM+FPGA
    1  开发板简介    XQ138F-EVM是一款基于广州星嵌TIOMAP-L138(浮点DSPC6748+ARM9)+XilinxSpartan-6FPGA核心板SOM-XQ138F设计的开发板,它为用户提供了SOM-XQ138F核心板的测试平台,用于快速评估SOM-XQ138F核心板的整体性能。 XQ138F-EVM底板采用沉金无铅工艺的四层板设......
  • 广州地铁设计研究院与您相约第十一届国际桥梁与隧道技术大会!
    第十一届国际桥梁与隧道技术大会将于9月23日-25日在成都举办。广州地铁设计研究院股份有限公司作为协办单位之一,届时将与各界同仁加强交流互鉴,共话桥隧未来!广州地铁设计研究院股份有限公司(以下简称设计院)成立于1993年6月,是广州地铁集团控股子公司,拥有国家工程设计综合甲级、工程勘......
  • 铺先生:广州开店选址细节,帮助大家找到合适的地址
    在广州这座美丽的一线大都市中,有着很多的朝九晚五的打工人,他们厌倦了打工的生活,想着找到一个合适的地址开一家属于自己的店铺。可是,自己对于开店选址这件事并不是很了解,不知道广州开店选址细节都有社什么。那么小编就针对这个问题,说一下看法,帮助大家排忧解难。1. 看街口类型我们......