题目:http://codeforces.com/problemset/problem/543/D

题意:给你一棵树,一开始边都是0,可以使任意的边变成1,对于每一个根节点求使得它到其他任一点的路径上只有一条0边的方案数。

假设只求一个根,f[u]=∏(s[v]+1)

然后移动根节点这样就可以通过遍历一遍树得到所有点的答案了。

s[v]=(s[u]/(s[v]+1)+1)*s[v] 这样当前根和根的其他子树就变成v的子树了(前面那坨就是它的贡献。。

(看起来是这样没错。。但是不能求逆元。因为s[u]可能为0 。。所以维护前缀和后缀bfs一遍就好了。。

  1. #include<cstring>
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<map>
  7. #define rep(i,l,r) for (int i=l;i<=r;i++)
  8. #define down(i,l,r) for (int i=l;i>=r;i--)
  9. #define clr(x,y) memset(x,y,sizeof(x))
  10. #define maxn 200500
  11. #define maxk 69
  12. #define inf 0x7fffffff
  13. #define ll long long
  14. #define mm 1000000007
  15. using namespace std;
  16. struct data{int obj,pre;
  17. }e[maxn*];
  18. ll g[maxn],s[maxn],ans[maxn],pr[maxn],sc[maxn];
  19. int head[maxn],a[maxn],vis[maxn],n,tot;
  20. int read(){
  21. ll x=,f=; char ch=getchar();
  22. while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
  23. while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
  24. return x*f;
  25. }
  26. void insert(int x,int y){
  27. e[++tot].obj=y; e[tot].pre=head[x]; head[x]=tot;
  28. }
  29. ll ni(ll x){
  30. ll y=mm-,ans=;
  31. while (y){
  32. if (y&) ans=ans*x%mm;
  33. x=x*x%mm;
  34. y>>=;
  35. }
  36. return ans;
  37. }
  38. ll dfs(int u,int f){
  39. s[u]=;
  40. for (int j=head[u];j;j=e[j].pre){
  41. int v=e[j].obj;
  42. if (v==f) continue;
  43. s[u]=s[u]*(dfs(v,u)+1LL)%mm;
  44. }
  45. return s[u];
  46. }
  47. void go(){
  48. g[]=;
  49. queue<int> q; clr(vis,); q.push();
  50. while (!q.empty()){
  51. int u=q.front(); q.pop(); vis[u]=;
  52. int sum=;
  53. for (int j=head[u];j;j=e[j].pre){
  54. int v=e[j].obj;
  55. if (!vis[v]) a[++sum]=v;
  56. }
  57. sort(a+,a++sum);
  58. pr[]=; rep(i,,sum) pr[i]=pr[i-]*(s[a[i]]+)%mm;
  59. sc[sum+]=g[u]; down(i,sum,) sc[i]=sc[i+]*(s[a[i]]+)%mm;
  60. rep(i,,sum) {
  61. s[a[i]]=(pr[i-]*sc[i+]%mm+)%mm*s[a[i]]%mm;
  62. g[a[i]]=(pr[i-]*sc[i+]%mm+)%mm;
  63. q.push(a[i]);
  64. }
  65. }
  66. }
  67. int main(){
  68. n=read();
  69. rep(i,,n) {
  70. int x=read(); insert(x,i); insert(i,x);
  71. }
  72. dfs(,);
  73. go();
  74. rep(i,,n-) printf("%lld ",s[i]%mm); printf("%lld\n",s[n]%mm);
  75. return ;
  76. }

CodeForces 543D:Road Improvement的更多相关文章

  1. VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs

    C. Road Improvement 题目连接: http://www.codeforces.com/contest/638/problem/C Description In Berland the ...

  2. Codeforces 543D. Road Improvement (树dp + 乘法逆元)

    题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...

  3. Codeforces 543D Road Improvement

    http://codeforces.com/contest/543/problem/D 题意: 给定n个点的树 问: 一开始全是黑边,对于以i为根时,把树边白染色,使得任意点走到根的路径上不超过一条黑 ...

  4. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  5. CodeForces 543D 树形DP Road Improvement

    题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数. 对于n个所有可能的x,输出n个答案. 分析: 题解 ...

  6. Codeforces 543D Road Improvement(DP)

    题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...

  7. Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp

    D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ...

  8. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  9. CodeForces 696A:Lorenzo Von Matterhorn(map的用法)

    http://codeforces.com/contest/697/problem/C C. Lorenzo Von Matterhorn time limit per test 1 second m ...

随机推荐

  1. Android Weekly Notes Issue #288

    Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...

  2. Button的五种点击事件

    1.内部类方式 class MyOnClickListener implements View.OnClickListener{ /** * Called when a view has been c ...

  3. 网关 php-cgi fastcgi phpfpm

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/88 关于网关的理解,一句话就是:作为一种翻译器,抽象出了一种能够 ...

  4. Docker了解

    Docker了解1.Docker能做什么:Docker能够解决虚拟机能够解决的问题,同时也能够解决虚拟机由于请求资源过高无法解决的问题. *隔离应用依赖 *创建应用镜像并进行复制 *创建容易分发的即启 ...

  5. HTML基本功之文档结构

    项目名 首页 命名为 index.html 样式文件夹 命名为 css  /*用来放样式文件*/ base.css  /*基本样式*/ index.css /*首页样式*/ global.css /* ...

  6. 腾讯云主机 MySQL 远程访问配置方法

    使用腾讯云主机安装 MySQL 之后,需要通过以下步骤进行配置以实现远程访问,主要分为两大部分 一.服务器端口配置 1.如果你的云主机配置了安全组,如果没有配置安全组就可以直接跳过“步骤1”的操作,否 ...

  7. Nodejs真.多线程处理

    前言 Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能 安装方法 npm install threads_a_gogo 下载测试源码 git ...

  8. touch事件应用

    js的touch事件,一般用于移动端的触屏滑动: $(function(){ document.addEventListener("touchmove", _touch, fals ...

  9. 【转】java jvm 线程 与操作系统线程

    原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故 ...

  10. NPOI 1.2 教程

    NPOI 1.2 教程官方地址 很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解. 目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 ...