原文链接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 ...
随机推荐
-
str_replace vs preg_replace
转自:http://benchmarks.ro/2011/02/str_replace-vs-preg_replace/ 事实证明str_replace确实比preg_replace快. If you ...
-
ajax无刷新获取php后台数据
$.ajax({ url:"result.php", //data:{"page":i}, dataType:"json", beforeS ...
-
Vue.2.0.5-事件处理器
监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. 示例: <div id="example-1"> <button v- ...
-
ZJU 1180 Self Numbers(暴力模拟判断,水题)
题目链接 同HDU 1128 , POJ 1316(这个范围小一点). 原本怕超时,以为有技巧或者规律,死命的想,后来发现这就是一道水体,模拟着全部判断一下就好了,10秒呢,完全不怕超时...唔,废话 ...
-
eclipse 在Navigator视图中查看资源
随着不断使用Eclipse,Navigator视图中的实体数目会增加.通过在某一项目或文件夹上右击,并在所出现的快捷菜单中选择Go Into命令,你就可以查看该项目或文件夹中的资源了.此时Naviga ...
-
window下svn注册为本地的服务
sc create svnservice binpath= "\"C:\program files\Subversion\bin\svnserve.exe\" --ser ...
-
unity3D HTC VIVE开发-物体高亮功能实现
在VR开发时,有时需要用到物体高亮的功能.这里使用Highlighting System v3.0.1.unitypackage插件实现. Highlighting System v3.0.1的介绍访 ...
-
C#高性能二进制序列化
二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小.性能高,应用面甚至还要高于json的序列化:开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列 ...
-
Spring HttpInvoker 从实战到源码追溯
Spring HttpInvoker 作为 Spring 家族中老牌远程调用模型,深受开发者喜爱. 其主要目的是来执行基于 HTTP 的远程调用(轻松穿越防火墙),并使用标准的 JDK 序列化机制. ...
-
fiddler 发送get请求
点击Composer 点击执行(Execute) \ 这里演示的是带cookie