首页 > 其他分享 >DPV Subtree

DPV Subtree

时间:2023-11-23 10:46:27浏览次数:31  
标签:fir DPV cnt int Subtree tp fa mod

题意

给定一棵 \(n\) 个节点的线段树。

任意黑白染色,求每个点被染成黑色且黑色点组成连通块的方案数。

Sol

考虑换根dp,钦定当前点作为根节点。

  • \(f_i\) 表示当前子树内的方案数。
  • \(g_i\) 表示子树外的方案数。

\(f\) 的转移显然是 \(f_u = \prod f_v + 1\)。

考虑 \(g\) 的转移。\(fa\) 子树外的贡献,以及 \(x\) 的兄弟儿子的贡献。

对于前者固然为 \(g_{fa}\),后者考虑预处理前缀积后缀积。

需要注意的是,两者都是只有当 \(fa\) 被选时才会有贡献,所以 \(g_{fa}\) 不 \(+1\)。

\(g_u = 1 + g_{fa} \times \prod f_v + 1, v \in {brother}\)。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
const int N = 1e5 + 5, M = 2e5 + 5;
int mod;

namespace G {

array <int, N> fir;
array <int, M> nex, to;
int cnt;
void add(int x, int y) {
	cnt++;
	nex[cnt] = fir[x];
	to[cnt] = y;
	fir[x] = cnt;
}

}

array <int, N> f, g;

array <int, N> fa;
void dfs1(int x) {
	f[x] = 1;
	for (int i = G::fir[x]; i; i = G::nex[i]) {
		if (G::to[i] == fa[x]) continue;
		fa[G::to[i]] = x;
		dfs1(G::to[i]);
		f[x] = f[x] * (f[G::to[i]] + 1) % mod;
	}
}

array <int, N> tp;
void dfs2(int x) {
	int cnt = 0;
	for (int i = G::fir[x]; i; i = G::nex[i]) {
		if (G::to[i] == fa[x]) continue;
		cnt++, tp[cnt] = f[G::to[i]] + 1;
	}
	tp[cnt + 1] = 1;
	for (int i = cnt; i; i--)
		tp[i] = tp[i] * tp[i + 1] % mod;
	cnt = 0;
	int kp = 1;
	for (int i = G::fir[x]; i; i = G::nex[i]) {
		if (G::to[i] == fa[x]) continue;
		cnt++;
		g[G::to[i]] = g[x] * kp % mod * tp[cnt + 1] % mod + 1;
		kp = kp * (f[G::to[i]] + 1) % mod;
	}
	for (int i = G::fir[x]; i; i = G::nex[i]) {
		if (G::to[i] == fa[x]) continue;
		dfs2(G::to[i]);
	}

}

signed main() {
	int n = read();
	mod = read();
	for (int i = 2; i <= n; i++) {
		int x = read(), y = read();
		G::add(x, y), G::add(y, x);
	}
	g[1] = 1;
	dfs1(1), dfs2(1);
	for (int i = 1; i <= n; i++) write(f[i] * g[i] % mod), puts("");
	return 0;
}

标签:fir,DPV,cnt,int,Subtree,tp,fa,mod
From: https://www.cnblogs.com/cxqghzj/p/17851018.html

相关文章

  • AtCoder Regular Contest 164 F Subtree Reversi
    洛谷传送门AtCoder传送门非常好题目。发现每个点颜色被反转的次数是固定的,为其深度(根结点深度为\(0\))。于是可以看作是,一放棋子就得到分数。那么先手取偶数层和后手取奇数层都会使先手得分,所以双方的目标都是尽可能多取偶数层的结点。考虑若一开始有偶数层的叶子,那么当前的......
  • dpvs dnat模式
    dnat模式发送报文src/ipvs/ip_vs_core.c针对ipv4,INET_HOOK_PRE_ROUTING注册2个函数dp_vs_pre_routing和dp_vs_in,因为nat不做防止DDos攻击的syn_proxy,所以看dp_vs_in。conn_sched新请求建立连接选择后端rs建立连接,支持tcp、udp和icmp。dp_vs_schedule->dp_vs_conn_new->dp_vs_c......
  • 安装dpvs
    #安装依赖yuminstallpopt-develautomakegcc-yyuminstall-ypython3-pipyuminstallnumactl-devel-yyuminstallopenssl-devel-y#安装python3.7.0和meson以及ninjatar-xvfPython-3.7.0.tar.xzcdPython-3.7.0./configure--prefix=/usr/local/python3./c......
  • dpvs syn-proxy实现分析
    1 syn flood就是同步发送SYN数据包,这样的操作对于发送方(攻击者)来说是非常容易实现的,而对于接收方(目标)来说会需要消耗更多的资源去接收和处理数据包。除此之外,在发送完SYN数据包之后,我们不需要等待接收端返回的SYN/ACK数据包,我们只需要继续向对方发送SYN数据包并让服务器自己去处......
  • Subtree 题解
    Subtree题目大意给定一颗树,你可以选出一些节点,你需要对于每个点求出在强制选这个点的情况下所有选择的点联通的方案数,对给定模数取模。思路分析对于这种求树上每一个点方案数的题目,首先考虑换根DP。强制嵌定树根为\(1\),设\(f_i\)表示在\(i\)的子树中选点,\(i\)强制选,所......
  • git subtree的使用简介
    1、gitsubtree的使用简介gitsubtree是一个Git命令,用于在单个Git仓库中管理多个项目。它允许您将一个项目的子目录作为独立的Git仓库处理,同时仍然保持在主仓库中。这使得在不使用子模块的情况下,更容易地将多个项目组合在一个仓库中。以下是gitsubtree的一些常见用法:添加子树......
  • 关于vcpkg中x-history命令移除后及git subtree的使用问答
    1、现在的版本中已经移除了x-history命令,我该使用什么方式来查看port的历史记录呢如果当前版本的vcpkg中已经移除了x-history命令,您可以使用以下方法查看port的历史记录:使用Git命令:首先,确保您已经安装了Git。然后,在命令行或终端中,导航到vcpkg的安装目录。接下来,使用以下命令......
  • Git 工具 - 子模块: submodule与subtree的使用
    git日常使用中,基本都是一个项目一个Git仓库的形式,那么当我们的代码中碰到了业务级别的需要复用的代码,我们一般怎么做呢?比如:某个工作中的项目需要包含并使用另一个项目。也许是第三方库,或者你独立开发的,用于多个父项目的库。所以需要提取一个公共的类库提供给多个项目使用,但是......
  • LC 572. Subtree of Another Tree
    572.SubtreeofAnotherTree思路与题解这是一道挺有意思的问题,有三种解法,其中第二种是KMP算法的应用。筛法的原理参见204.CountPrimes。解法1:暴力dfs法。直接暴力......
  • 572. Subtree of Another Tree[Easy]
    572.SubtreeofAnotherTreeGiventherootsoftwobinarytreesrootandsubRoot,returntrueifthereisasubtreeofrootwiththesamestructureandnodev......