原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html

题目传送门 - 2018牛客多校赛第二场 E

题意

  一棵 $n$ 个结点的树,每个点有一个点权,有 $m$ 次操作,每次操作有三种:

  1.  修改一个点的点权

  2.  修改一个点的父亲

  3.  询问包含某个点的所有大小为 $c$ 的连通块的点权乘积之和。

  $n,m\leq 100000,c\leq10 $

题解

    

  

  
  以上题解图片摘自 laofu 题解。

  我再画几幅图介绍一下:

  注:箭头表示箭头尾端节点的 dp 对箭头指向节点有 dp 贡献。

    虚箭头表示中间省略一些有箭头连接的节点。

    虚线表示中线省略一些节点,但是没有箭头连接。

    每个图,最上面的节点表示往上走 $10$ 步到达的祖先。

    最下面的节点表示操作中的 $x$ 节点。

    注意一下修改和询问里面各有一个特殊箭头,意义自己理解。

  

  

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int read(){
  4. char ch=getchar();
  5. int x=0;
  6. while (!isdigit(ch))
  7. ch=getchar();
  8. while (isdigit(ch))
  9. x=(x<<1)+(x<<3)+ch-48,ch=getchar();
  10. return x;
  11. }
  12. const int N=100005,mod=1e9+7;
  13. int n,m,val[N],fa[N];
  14. int dp[N][11];
  15. int Pow(int x,int y){
  16. int ans=1;
  17. for (;y;y>>=1,x=1LL*x*x%mod)
  18. if (y&1)
  19. ans=1LL*ans*x%mod;
  20. return ans;
  21. }
  22. void DP(int a,int b){
  23. if (!a||!b)
  24. return;
  25. for (int i=10;i>=1;i--)
  26. for (int j=1;j<i;j++)
  27. dp[a][i]=(1LL*dp[a][i]+1LL*dp[a][j]*dp[b][i-j])%mod;
  28. }
  29. void IDP(int a,int b){
  30. if (!a||!b)
  31. return;
  32. for (int i=1;i<=10;i++)
  33. for (int j=1;j<i;j++)
  34. dp[a][i]=(1LL*dp[a][i]-1LL*dp[a][j]*dp[b][i-j])%mod;
  35. }
  36. int main(){
  37. n=read(),m=read();
  38. memset(dp,0,sizeof dp);
  39. for (int i=1;i<=n;i++)
  40. dp[i][1]=val[i]=read();
  41. for (int i=2;i<=n;i++)
  42. fa[i]=read();
  43. for (int i=n;i>1;i--)
  44. DP(fa[i],i);
  45. while (m--){
  46. int opt=read(),x=read(),y=read(),anc[15];
  47. if (opt==0){
  48. for (int i=1,j=x;i<=10;i++,j=fa[j])
  49. anc[i]=j;
  50. for (int i=10;i>1;i--)
  51. IDP(anc[i],anc[i-1]);
  52. int inv=Pow(val[x],mod-2);
  53. val[x]=y;
  54. for (int i=1;i<=10;i++)
  55. dp[x][i]=1LL*dp[x][i]*inv%mod*y%mod;
  56. for (int i=1;i<10;i++)
  57. DP(anc[i+1],anc[i]);
  58. }
  59. if (opt==1){
  60. for (int i=1,j=x;i<=10;i++,j=fa[j])
  61. anc[i]=j;
  62. for (int i=10;i>1;i--)
  63. IDP(anc[i],anc[i-1]);
  64. for (int i=2;i<10;i++)
  65. DP(anc[i+1],anc[i]);
  66. fa[x]=y;
  67. for (int i=1,j=x;i<=10;i++,j=fa[j])
  68. anc[i]=j;
  69. for (int i=10;i>2;i--)
  70. IDP(anc[i],anc[i-1]);
  71. for (int i=1;i<10;i++)
  72. DP(anc[i+1],anc[i]);
  73. }
  74. if (opt==2){
  75. for (int i=1,j=x;i<=10;i++,j=fa[j])
  76. anc[i]=j;
  77. for (int i=10;i>1;i--)
  78. IDP(anc[i],anc[i-1]);
  79. for (int i=10;i>1;i--)
  80. DP(anc[i-1],anc[i]);
  81. printf("%d\n",(dp[x][y]+mod)%mod);
  82. for (int i=1;i<10;i++)
  83. IDP(anc[i],anc[i+1]);
  84. for (int i=1;i<10;i++)
  85. DP(anc[i+1],anc[i]);
  86. }
  87. }
  88. return 0;
  89. }

  

2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  4. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

  8. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...

随机推荐

  1. MySQL笔记二

    Ø function 函数 函数的作用比较大,一般多用在select查询语句和where条件语句之后.按照函数返回的结果, 可以分为:多行函数和单行函数:所谓的单行函数就是将每条数据进行独立的计算,然 ...

  2. mac系统 安装 JDK 并配置环境

    第一步 : 下载 mac 版的 JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...

  3. iOS 中的block异常 判断block是否为空

    我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64位,则address=0 ...

  4. Confluence 6 附件存储选项

    在早期的 Confluence 版本中,我们允许存储附件到 WebDav 或者 Confluence 数据库中.针对新的 Confluence 安装,我们不再支持这 2 种存储了. 本地文件系统 在默 ...

  5. 【Windows】添加定时任务不执行

    [问题]windows定时任务不执行.在“所有程序->附件->系统工具->任务计划程序”中添加了定时调用“D:\sys_task\bugmanager\run.bat”脚本的任务计划 ...

  6. LeetCode(107): 二叉树的层次遍历 II

    Easy! 题目描述: 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,20,null,null,15,7], ...

  7. java 命令行JDBC连接Mysql

    环境:Windows10 + java8 + mysql 8.0.15 + mysql-connector-java-8.0.15.jar mysql驱动程序目录 项目目录 代码: //package ...

  8. 网络扫描信息收集基于(Windows)

    1.首先说明一下一款网络扫描工具,在之前的博客中我曾简要的写过关于Advance IP Scanner使用方法,最近要写网络扫描的工具,所以对这款工具做一个详细的功能细节上的介绍. 如下图  在输入框 ...

  9. arm指令1

    .section .text.writeFUNCTION(write) ldr r12, =__NR_write swi #0 bx lr LDR: LDR 的两种用法 1)LDR pc, =MyHa ...

  10. cf1042d 树状数组逆序对+离散化

    /* 给定一个数组,要求和小于t的段落总数 求前缀和 dp[i]表示以第i个数为结尾的小于t的段落总数,sum[i]-sum[l]<t; sum[i]-t<sum[l],所以只要找到满足条 ...