题目链接

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. Codeforces 804D Expected diameter of a tree(树形DP+期望)

    [题目链接] http://codeforces.com/contest/804/problem/D [题目大意] 给你一个森林,每次询问给出u,v, 从u所在连通块中随机选出一个点与v所在连通块中随 ...

  3. codeforces 161 D. Distance in Tree(树形dp)

    题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...

  4. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...

  5. Educational Codeforces Round 67 E.Tree Painting (树形dp)

    题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...

  6. HDU5834 Magic boy Bi Luo with his excited tree(树形DP)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5834 Description Bi Luo is a magic boy, he also ...

  7. BZOJ-3227 红黑树(tree) 树形DP

    个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...

  8. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  9. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. Navicat远程连接centos上mysql出错

    原因1:mysql账户是不允许远程连接 参考:centos安装mysql(for 小白) 打开远程连接 原因2:3306端口未开启 开启端口:iptables -I INPUT -p tcp --dp ...

  2. 清北学堂-DAY2-数论专题-中国剩余定理(CRT)

    首先请看定义:(百科上抄下来的)孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国余数定理. 一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作&l ...

  3. mysql-8.0.16-winx64的最新安装教程

    最近刚学习数据库,首先是了解数据库是什么,数据库.数据表的基本操作,这就面临了一个问题,mysql的安装,我这里下载的是64位的,基于Windows的,以下是在我电脑上的安装过程,希望可以帮助到大家. ...

  4. 8.读写锁ReadWriteLock

    /*ReadWriteLock 读写锁*/ private ReadWriteLock lock = new ReentrantReadWriteLock(); lock.readLock().loc ...

  5. 深度学习_1_神经网络_4_分布式Tensorflow

    分布式Tensorflow 单机多卡(gpu) 多级多卡(分布式) 自实现分布式 API: ​ 1,创建一个tf.train.ClusterSpec,用于对集群的所有任务进行描述,该描述对于所有任务相 ...

  6. MySQL表的修改

    修改表的名字 ALTER TABLE 旧表名 RENAME 新表名; 字段的修改: 添加字段 ALTER TBALE 表名 ADD COLUMN 新字段 INT; 删除字段 ALTER TBALE 表 ...

  7. rsync备份案例

    客户端需求 1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02 2.客户端在本地打包备份(系统配置文件.应用配置等)拷贝至/back ...

  8. flink相关

    flink一.简单实时计算方案 假如现在我们有一个电商平台,每天访问的流量巨大,主要访问流量都集中在衣服类.家电类页面,那么我们想实时看到这两类页面的访问量走势(十分钟出一个统计量),当做平台的重要指 ...

  9. window open() 方法

    open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口. 语法 window.open(URL,name,specs,replace) 参数 说明 URL 可选.打开指定的页面的URL.如 ...

  10. 「数据结构与算法(Python)」(一)

    算法的提出 算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务.一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写 ...