CF1929D Sasha and a Walk in the City

简单树形动态规划。

我们把选取到的点称为黑点,由题意得,一个合法的点集能使树中任意一条简单路径上的黑点数量不超过两个。也就是说,如果黑点数量多于 \(2\),对于任意两个黑点,它们如果在同一个节点的子树内,必然是兄弟关系。否则,一旦存在祖先关系,由于黑点数量多于 \(2\),必然有一个黑点可以与这两个点组成一条黑点数量超过两个的简单路径。

设状态 \(dp_{i,j}\) 表示以 \(i\) 为根的子树内,从根到叶子节点最多经过 \(j\) 个黑点。显然,只有 \(j\) 等于 \(0,1\) 或 \(2\) 时,状态是合法的。

考虑如何转移,对于 \(dp_{i,0}\),显然等于 \(1\)。

对于 \(dp_{i,1}\),由于根到叶子节点最多经过黑点数最大值为 \(1\),最多就是两条到根的路径合并,经过 \(1+1=2\) 个黑点,所以每一个儿子内可以任意选择。另外,每个子树内还可以从没有黑点涂子树的根上的黑点变成有 \(1\) 个黑点,所以还需要加入没有黑点的方法数。根据乘法原理,可以推出如下转移式:

\[dp_{i,1}=\prod_{j\in son(i)}(dp_{j,0}+dp_{j,1})=\prod_{j\in son(i)}(1+dp_{j,1})
\]

对于 \(dp_{i,2}\),由于根到叶子节点最多经过黑点数最大值为 \(2\),所以只能有一个子树内的 \(dp\) 值可以转移来,否则必然可以构造一条黑点数量超过两个的简单路径。另外,每个子树内还可以从 \(1\) 个黑点涂子树的根上的黑点变成有 \(2\) 个黑点,所以还需要加入 \(1\) 个黑点的方法数。根据加法原理,可以推出如下转移式:

\[dp_{i,2}=\sum_{j\in son(i)}(dp_{j,1}+dp_{j,2})
\]

以 \(1\) 为整棵树的根,最后的答案为 \(dp_{1,0}+dp_{1,1}+dp_{1,2}\),也就是 \(1+dp_{1,1}+dp_{1,2}\)。

#include <bits/stdc++.h>
using namespace std;
struct edge
{
long long v,nxt;
}e[800000];
long long t,u,v,n,mod=998244353,h[800000],f[800000][3],cnt=0;
void add_edge(long long u,long long v)
{
e[++cnt].nxt=h[u];
e[cnt].v=v;
h[u]=cnt;
} void init()
{
for(int i=1;i<=n;i++)h[i]=0,f[i][1]=1,f[i][2]=0;
cnt=0;
} void dfs(long long x,long long fa)
{
for(int i=h[x];i;i=e[i].nxt)
if(e[i].v!=fa)
{
dfs(e[i].v,x);
f[x][1]=(f[x][1]*(f[e[i].v][1]+1)%mod)%mod;
f[x][2]=(f[x][2]+f[e[i].v][1]+f[e[i].v][2])%mod;
}
} int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
init();
for(int i=1;i<=n-1;i++)
{
scanf("%lld%lld",&u,&v);
add_edge(u,v),add_edge(v,u);
}
dfs(1,0);
printf("%lld\n",(f[1][1]+f[1][2]+1)%mod);
}
return 0;
}

CF1929D Sasha and a Walk in the City 题解的更多相关文章

  1. bzoj3125: CITY 题解

    3125: CITY Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 486  Solved: 213[Submit][Status][Discuss] ...

  2. ZOJ 3195 Design the city 题解

    这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据  1 < N < 50000  1 < Q ...

  3. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...

  4. [HIMCM暑期班]第2课:建模

    第二节课从最简单的模型开始入手:七桥问题. 首先,先去wikipedia上了解一些有关七桥问题的背景知识.http://en.wikipedia.org/wiki/Seven_Bridges_of_K ...

  5. D. Bear and Two Paths(贪心构造)

    D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  6. VK Cup 2016 D. Bear and Two Paths 模拟

    D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  7. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) D. Bear and Two Paths 构造

    D. Bear and Two Paths 题目连接: http://www.codeforces.com/contest/673/problem/D Description Bearland has ...

  8. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) D

    D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  9. codeforces 673D D. Bear and Two Paths(构造)

    题目链接: D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input ...

  10. cf公式专场-续

    Benches Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

随机推荐

  1. RAGflow搭建text-to-sql的AI研发助手

    一.概述 text-to-sql 技术允许用户通过自然语言提问,系统自动将其转换为 SQL 语句并执行,大大降低了数据查询的门槛,提高了工作效率. text-to-sql 技术在数据分析.智能客服.数 ...

  2. 康谋技术 |高效同步与处理:ADTF流服务在自动驾驶数采中的应用

    随着自动驾驶技术的发展,车辆的智能化程度不断提高,这体现了车辆感知,决策以及执行的能力.在算法开发和迭代过程中,提高测试和开发效率,关键在于多传感器数据的高质量采集,确保数据的同步性.完整性和一致性. ...

  3. JVM 的内存区域是如何划分的?

    JVM 的内存区域划分 JVM 在运行时会将内存划分为多个区域,用于管理程序运行时的不同类型数据.以下是 JVM 内存的主要划分: 1. 方法区(Method Area) 定义: 方法区是运行时数据区 ...

  4. CF1573B题解

    题意: 对于给定的序列 aA1,aA2,-,aAna_{A1},a_{A2},-,a_{An}aA1​,aA2​,-,aAn​.bB1,bB2,-,bBnb_{B1},b_{B2},-,b_{Bn}b ...

  5. Spring Ioc源码引入:什么是IoC,IoC解决了什么问题

    Spring Ioc源码引入:什么是IoC,IoC解决了什么问题 什么是IoC 用一个故事举例: 小陈想开一家咖啡店,于是独自创业.找咖啡豆供应商.买咖啡机.招员工,样样都要自己来.开店成本很高.后来 ...

  6. 解析异步消息加上(→_→)@SuppressLint("HandlerLeak")

    在主线程又Handler处理消息出现时这样写会有警告 private Handler handler = new Handler(){ @Override public void handleMess ...

  7. 首发 最新AWVS/Acunetix Premium V24.8高级版漏洞扫描器(最新版)Windows/Linux下载

    前言 Acunetix Premium 是一种 Web 应用程序安全解决方案,用于管理多个网站.Web 应用程序和 API 的安全.集成功能允许您自动化 DevOps 和问题管理基础架构. Acune ...

  8. IO流-转换流、序列化流--java进阶day14

    1.转换流 转换流本质还是字符流的子类 转换流的作用 1.可以按照指定的编码进行读写操作 我们使用的IO流,默认格式都是UTF-8,如果一个文件是GBK格式,在读写的时候就会乱码,此时就可以使用转换流 ...

  9. 【工具】秘塔AI搜索|推荐一个现在还免费的AI聚合搜索工具

    网址:https://metaso.cn/ 使用时间:2024/03/27 . 2024/04/10 以前其实用过它家的秘塔写作猫,当时感觉非常不错. 这次看到它出AI搜索,感觉开发者挺有野心和实力的 ...

  10. 【HUST】网络攻防实践|6_物联网设备固件安全实验|flag2~5速通指南

    写在最前:最近没空写报告,实验原理虽然已经摸清了但是没空写.flag2到4是一些大胆的想法的通关方式,flag5是正经通关的.之后写报告的时候会补发正经的实验原理,和flag2到4正常的通关方式. 记 ...