题意:

有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数。

对于n个所有可能的x,输出n个答案。

分析:

题解

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int maxn = + ;
  9. const int MOD = ;
  10. int n;
  11.  
  12. vector<int> G[maxn], pre[maxn], suf[maxn];
  13.  
  14. void scan(int& x)
  15. {
  16. x = ;
  17. char c = ' ';
  18. while(c < '' || c > '') c = getchar();
  19. while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
  20. }
  21.  
  22. int d[maxn], f[maxn];
  23.  
  24. void mul(int& x, int y) { x = 1LL * x * y % MOD; }
  25.  
  26. void dfs(int u)
  27. {
  28. d[u] = ;
  29. int sz = G[u].size();
  30. for(int i = ; i < sz; i++)
  31. {
  32. int v = G[u][i];
  33. dfs(v);
  34. mul(d[u], d[v] + );
  35. }
  36.  
  37. int p = , s = ;
  38. for(int i = ; i < sz; i++)
  39. {
  40. mul(p, d[G[u][i]] + );
  41. mul(s, d[G[u][sz--i]] + );
  42. pre[u].push_back(p);
  43. suf[u].push_back(s);
  44. }
  45.  
  46. reverse(suf[u].begin(), suf[u].end());
  47. }
  48.  
  49. void dfs2(int u)
  50. {
  51. int sz = G[u].size();
  52. for(int i = ; i < sz; i++)
  53. {
  54. int v = G[u][i];
  55. f[v] = f[u];
  56. if(i > ) mul(f[v], pre[u][i - ]);
  57. if(i < sz - ) mul(f[v], suf[u][i + ]);
  58. f[v]++;
  59. if(f[v] >= MOD) f[v] -= MOD;
  60. dfs2(v);
  61. }
  62. }
  63.  
  64. int main()
  65. {
  66. scanf("%d", &n);
  67. for(int x, i = ; i <= n; i++)
  68. {
  69. scan(x);
  70. G[x].push_back(i);
  71. }
  72.  
  73. dfs();
  74. f[] = ;
  75. dfs2();
  76.  
  77. for(int i = ; i <= n; i++) printf("%I64d ", 1LL * d[i] * f[i] % MOD);
  78.  
  79. return ;
  80. }

代码君

CodeForces 543D 树形DP Road Improvement的更多相关文章

  1. Codeforces 1153D 树形DP

    题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...

  2. Codeforces 1088E 树形dp+思维

    比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...

  3. Codeforces 1179D 树形DP 斜率优化

    题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...

  4. CodeForces - 337D 树形dp

    题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能 ...

  5. CodeForces 219D 树形DP

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  6. DP系列——树形DP(Codeforces543D-Road Improvement)

    一.题目链接 http://codeforces.com/problemset/problem/543/D 二.题意 给一棵树,一开始所有路都是坏的.询问,以每个节点$i$为树根,要求从树根节点到其他 ...

  7. codeforces 337D 树形DP Book of Evil

    原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...

  8. Up and Down the Tree CodeForces - 1065F (树形dp)

    链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...

  9. codeforces 1053D 树形DP

    题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k. 问给每个叶子的值赋为几 ...

随机推荐

  1. Reset CSS 页面初始化css

    CSS 初始化样式(Reset CSS 官网提供): /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: non ...

  2. Nginx服务器301跳转到带www的域名的方法

    为什么要这么做? 我们的域名在做解析时经常会解析2个域名,即带www的和不带www的.这样做的目的是,当用户使用不带www的域名时,也可以正常访问你的网站.但是这样做的后果是,你站点主域名的PR值分散 ...

  3. java控制远程ssh-JSCH(二)

    github: https://github.com/wengyingjian/ssh-java-demo.git 这次找到了一套新的api,叫jsch.网上查了一下,顺便把官网的几个demo给一通拿 ...

  4. python3发送邮件01(简单例子,不带附件)

    # -*- coding:utf-8 -*-import smtplibfrom email.header import Headerfrom email.mime.text import MIMET ...

  5. 安装指定版本的minikube

    Minikube是什么? Kubernetes集群的安装和部署对于很多初学者来说是一道坎.为了方便大家开发和体验Kubernetes,Kubernetes开源社区提供了可以在本地部署的Minikube ...

  6. UVALive 5031 Graph and Queries (Treap)

    删除边的操作不容易实现,那么就先离线然后逆序来做. 逆序就变成了合并,用并存集判断连通,用Treap树来维护一个连通分量里的名次. Treap = Tree + Heap.用一个随机的优先级来平衡搜索 ...

  7. SG函数入门&&HDU 1848

    SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...

  8. python_96_类的继承1

    #面向对象3大特性:封装,多态,继承 # 继承可节省内存,减少代码 class People(): def __init__(self,name,age): self.Name=name self.A ...

  9. linux - mysql 安装教程

    环境介绍>>>>>>>>>>>>>>>>>> 操作系统:Centos 7 mysql数据库版 ...

  10. C#数组添加元素

    一.向数组添加元素 在C#中,只能在动态数组ArrayList类中向数组添加元素.因为动态数组是一个可以改变数组长度和元素个数的数据类型. 示例: using System;using System. ...