题目链接

http://codeforces.com/contest/1276/problem/D

题解

我什么DP都不会做,吃枣药丸……
设\(f_{u,j}\)表示\(u\)子树内,\(j=0\)要求\(u\)点在轮到其父边之前被删,\(j=1\)要求\(u\)点被其父边删掉,\(j=2\)要求\(u\)点在其父边之后被删或者最后没有被删。
转移: 设儿子有\(s\)个,分别为\(v_1,v_2,...,v_s\), 且按边的编号从小到大排序,父边编号位于\(d\)和\((d+1)\)之间。
枚举被哪条边删除。
\[f_{u,0}=\sum^d_{i=1}(\prod^{i-1}_{j=1}(f_{v_j,0}+f_{v_j,1})\cdot f_{v_i,2}\cdot \prod^s_{j=i+1}(f_{v_j,0}+f_{v_j,2}))\]
\[f_{u,1}=\prod^d_{i=1}(f_{v_j,0}+f_{v_j,1})\cdot \prod^s_{i=d+1}(f_{v_j,0}+f_{v_j,2})\]
\[f_{u,2}=\sum^s_{i=d+1}(\prod^{i-1}_{j=1}(f_{v_j,0}+f_{v_j,1})\cdot f_{v_i,2}\cdot \prod^s_{j=i+1}(f_{v_j,0}+f_{v_j,2}))+\prod^{s}_{i=1}(f_{v_j,0}+f_{v_j,1})\]
维护前后缀积即可。
时间复杂度\(O(n)\).

代码

#include<bits/stdc++.h>
#define llong long long
#define pii pair<int,int>
#define mkpr make_pair
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int N = 2e5;
const int P = 998244353;
vector<pii> adj[N+3];
int fa[N+3],fae[N+3];
llong aux1[N+3],aux2[N+3];
llong f[N+3][3];
int n,en;void dfs(int u)
{sort(adj[u].begin(),adj[u].end()); int faid = -1,adjn = adj[u].size();for(int i=0; i<adj[u].size(); i++){int o = adj[u][i].first,v = adj[u][i].second;if(v==fa[u]) {faid = i; continue;} fa[v] = u,fae[v] = o;dfs(v);}aux1[0] = 1ll;for(int i=0; i<adj[u].size(); i++){int v = adj[u][i].second; if(v==fa[u]) {aux1[i+1] = aux1[i]; continue;}aux1[i+1] = aux1[i]*(f[v][0]+f[v][1])%P;}aux2[adj[u].size()+1] = 1ll;for(int i=(int)adj[u].size()-1; i>=0; i--){int v = adj[u][i].second; if(v==fa[u]) {aux2[i+1] = aux2[i+2]; continue;}aux2[i+1] = aux2[i+2]*(f[v][0]+f[v][2])%P;}f[u][0] = 0ll;for(int i=0; i<faid; i++){int v = adj[u][i].second;llong tmp = aux1[i]*f[v][2]%P*aux2[i+2]%P; f[u][0] = (f[u][0]+tmp)%P;}if(faid!=-1) {f[u][1] = aux1[faid]*aux2[faid+2]%P;}f[u][2] = 0ll;for(int i=faid+1; i<adj[u].size(); i++){int v = adj[u][i].second;llong tmp = aux1[i]*f[v][2]%P*aux2[i+2]%P; f[u][2] = (f[u][2]+tmp)%P;}f[u][2] = (f[u][2]+aux1[adjn])%P;
}int main()
{scanf("%d",&n);for(int i=1; i<n; i++){int u,v; scanf("%d%d",&u,&v);adj[u].push_back(mkpr(i,v)); adj[v].push_back(mkpr(i,u));}dfs(1);printf("%I64d\n",f[1][2]);return 0;
}

Codeforces 1276D/1259G Tree Elimination (树形DP)相关推荐

  1. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  2. 【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)

    题干: 在星际争霸(StarCraft)中,有3个种族.对于任意一个种族,他们的建筑建造都是有一个顺序的.这个顺序正好是一个树形结构,我们称之为"科技树"(Technology t ...

  3. Codeforces1153D-Serval and Rooted Tree(树形dp)

    原题链接:http://codeforces.com/problemset/problem/1153/D 题目原文: D. Serval and Rooted Tree time limit per ...

  4. D. Nastia Plays with a Tree(树形dp)

    https://codeforces.com/contest/1521/problem/D 思路: 把树上的单链初始时每个点是一个链.然后类似树形dp递归.递归过程中模拟链的断开,拼凑新的链头链尾. ...

  5. CodeForces - 1324F Maximum White Subtree(树形dp)

    题目链接:点击查看 题目大意:给出 n 个点组成的树,每个点都有一个颜色,非黑即白,现在问对于每个点而言,选出一个连通块,使得白色点的个数与黑色点的个数做差最大 题目分析:记录一下div3的第一次ak ...

  6. CF1120D Power Tree(树形DP/构造+差分+最小生成树)

    解法一:树形DP 个人觉得这个方法是比较可能想到的,但是输出方案很恶心 先转换题意:"无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空"意味着每个叶子节点 ...

  7. bzoj4987: Tree(树形dp)

    Description 从前有棵树. 找出K个点A1,A2,-,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  8. 【CF1646D】D. Weight the Tree(树形dp、贪心)

    加权树 题意: 给定一颗树,让你给树上的点赋予权值.定义一个点的权值等于其所有相邻节点的权重之和时,这个点就是 good. 你需要找到一种赋值方法,使得树中 good 点数最多,同时所有顶点的权重总和 ...

  9. 2020牛客多校9:B. Groundhog and Apple Tree(树形DP + 分类讨论 + 贪心)

    题目大意:有一棵苹果树,每个节点有一个苹果,吃掉 uuu 点的苹果能获得 aua_uau​点 HP,经过第 iii 条边需要消耗 wiw_iwi​ HP,在原地等待一秒可以获得 111 HP,每条边只 ...

最新文章

  1. “被遗忘的宇航员”逝世,他是阿波罗11号上唯一没登月的人
  2. 电脑关机慢是什么原因_为什么电脑无法关机?电脑无法正常关机的解决方案
  3. pomelo 分布式聊天入门客户端demo(c#)
  4. Django 模板语言 标签
  5. jframe透明_使JFrame透明
  6. WP博客ajax,WordPress文章点击统计ajax版,兼容wp super cache缓存代码及插件
  7. Vue-cli搭建vue基础项目
  8. Source Insight建工程之Kernel
  9. 方差分析软件_重复测量方差分析的操作教程及结果解读
  10. HP笔记本430 G3 ubuntu系统无线网卡驱动安装
  11. MySQL工作有多努力--了解MySQL Threads Running
  12. 为什么写技术博客对新人如此重要
  13. 网络攻防技术(郑大信安个人总结版)
  14. 闲置台式机+文件服务器,卖不出闲置台式机再利用之我的nas!
  15. 三氟磺隆(CAS 82097-50-5)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. PyDev Eclipse使用技巧说明
  17. 用MFC画一个美国队长的盾牌
  18. 微信SDK开发学习第一课
  19. 伦敦网约车新规:须通过英语水平考试
  20. 使用SWFUpload上传文件

热门文章

  1. 机器学习笔试精选题精选(四)
  2. php 表单录入,PHP 表单和用户输入
  3. 推荐系统-应用Pandas进行数据处理
  4. 结构张量用于区分平坦、边缘、角点区域
  5. 点击表格获取列索引的方法
  6. junit单元测试报错InvalidTestClassError: Invalid test class
  7. Cannot add or update a child row: a foreign key constraint fails
  8. 使用分支限界法解决单源最短路径问题。
  9. 关于解决tomcat的一个错误
  10. sizeof 的结果取决于什么