2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接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$ 节点。
注意一下修改和询问里面各有一个特殊箭头,意义自己理解。



代码
#include <bits/stdc++.h>
using namespace std;
int read(){
char ch=getchar();
int x=0;
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
const int N=100005,mod=1e9+7;
int n,m,val[N],fa[N];
int dp[N][11];
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
void DP(int a,int b){
if (!a||!b)
return;
for (int i=10;i>=1;i--)
for (int j=1;j<i;j++)
dp[a][i]=(1LL*dp[a][i]+1LL*dp[a][j]*dp[b][i-j])%mod;
}
void IDP(int a,int b){
if (!a||!b)
return;
for (int i=1;i<=10;i++)
for (int j=1;j<i;j++)
dp[a][i]=(1LL*dp[a][i]-1LL*dp[a][j]*dp[b][i-j])%mod;
}
int main(){
n=read(),m=read();
memset(dp,0,sizeof dp);
for (int i=1;i<=n;i++)
dp[i][1]=val[i]=read();
for (int i=2;i<=n;i++)
fa[i]=read();
for (int i=n;i>1;i--)
DP(fa[i],i);
while (m--){
int opt=read(),x=read(),y=read(),anc[15];
if (opt==0){
for (int i=1,j=x;i<=10;i++,j=fa[j])
anc[i]=j;
for (int i=10;i>1;i--)
IDP(anc[i],anc[i-1]);
int inv=Pow(val[x],mod-2);
val[x]=y;
for (int i=1;i<=10;i++)
dp[x][i]=1LL*dp[x][i]*inv%mod*y%mod;
for (int i=1;i<10;i++)
DP(anc[i+1],anc[i]);
}
if (opt==1){
for (int i=1,j=x;i<=10;i++,j=fa[j])
anc[i]=j;
for (int i=10;i>1;i--)
IDP(anc[i],anc[i-1]);
for (int i=2;i<10;i++)
DP(anc[i+1],anc[i]);
fa[x]=y;
for (int i=1,j=x;i<=10;i++,j=fa[j])
anc[i]=j;
for (int i=10;i>2;i--)
IDP(anc[i],anc[i-1]);
for (int i=1;i<10;i++)
DP(anc[i+1],anc[i]);
}
if (opt==2){
for (int i=1,j=x;i<=10;i++,j=fa[j])
anc[i]=j;
for (int i=10;i>1;i--)
IDP(anc[i],anc[i-1]);
for (int i=10;i>1;i--)
DP(anc[i-1],anc[i]);
printf("%d\n",(dp[x][y]+mod)%mod);
for (int i=1;i<10;i++)
IDP(anc[i],anc[i+1]);
for (int i=1;i<10;i++)
DP(anc[i+1],anc[i]);
}
}
return 0;
}
2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
随机推荐
- Solidworks设计电路外形导入AltiumDesigner
将实际设计好的三维电路图的底板(单个零件模式下)轮廓另存为dwf或者dwg 这时候会出现一个选项框,需要进行一些设置 单位选择mm,这个按照自己的需求选择单位 单位映射选择为1mm,也就是1:1的比例 ...
- atoi 和 itoa的实现
atoi 和 itoa是面试笔试经常要考到的题目,下面两份代码是用C语言实现的atoi和itoa: 1, atoi 原型: int atoi(const char *nptr); 函数说明: 参数np ...
- dubbo @Activate 注解使用和实现解析
Activate注解表示一个扩展是否被激活(使用),可以放在类定义和方法上, dubbo用它在spi扩展类定义上,表示这个扩展实现激活条件和时机. 先看下定义: @Documented @Retent ...
- 密码正确 mysql无法登陆 red7.3 上安装mysql5.6后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passswd :yes)
集群需要mysql存储元数据,就在前几天还运行好好的,突然就进不去了......还是太菜,遇到的bug少. 引起这种故障的原因有很多......第一个坑比较多,大部分用户也就用第一个就可以解决问题,我 ...
- SQLServer 2014 本地机房HA+灾备机房DR解决方案
SQLServer 2014 主数据中心HA+灾备机房DR解决方案 SQLServer 2008 的时候使用 local WSFC+DR Mirror方式,对象是单数据库 两个单独的 WSFC 上使用 ...
- Confluence 6 home 目录中的内容
Confluence home 目录存储了 Confluence 在运行中所使用的数据.下面对 Confluence home 目录中使用的数据和文件进行一些说明: confluence.cfg.xm ...
- nginx实战(三)之静态资源web服务(跨站访问)
语法 虽然说浏览器禁止跨站访问以防(CSRF),但出于一些原因还是要进行跨站访问,服务端通过设置头信息Access-Control-Allow-Orign:xxxx,客户端收到后就会允许跨站访问了 实 ...
- 将Maven项目打包成可执行jar文件(引用第三方jar)
方法一. mvn assembly 或 mvn package (一个jar包) 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> ...
- mysql解决外网不能连接
mysql解决外网不能连接 Author:SimpleWu 或许有些时候会遇到通过ip地址访问项目的数据库,可是访问失败了. 现在给大家一种解决方案: #进入mysql数据库 USE mysql; # ...
- 【python】confluent_kafka将offset置为最大
该博文方法有问题,正确方案在http://www.cnblogs.com/dplearning/p/7992994.html 将指定group对应的offset重置到最大值,跳过未消费数据 代码如下: ...