hihoCoder 1347 小h的树上的朋友
时间限制:18000ms
单点时限:2000ms
内存限制:512MB
描述
小h拥有
岁月流逝,小h的朋友们形成了一种稳定的树状关系。每位朋友恰好对应树上的一个节点。
每次小h想请两位朋友一起聚餐,他都必须把连接两位朋友的路径上的所有朋友都一起邀请上。并且聚餐的花费是这条路径上所有朋友的亲密度乘积。
小h很苦恼,他需要知道每一次聚餐的花销。小h问小y,小y当然会了,他想考考你。
输入
输入文件第一行是一个整数
输入文件第二行是
接下来
然后是一个整数
输出
对于每一次询问操作,你需要输出一个整数,表示聚餐所需的花费。你的答案应该模
样例输入
3
1 2 3
1 2
2 3
5
0 1 2
0 1 3
1 2 3
1 3 5
0 1 3
样例输出
2
6
15
Solution
比较裸的做法是树链剖分,我试了一发,但这题数据较大,会TLE ,不过据说LCT可以水过, 然而我不会LCT。
正解:DFS序 + 树状数组/线段树,询问和更新复杂度都是
对节点
显然
上式中
不过我一开始把这个式子搞错了:
WA了N发,真是太SB了。。。
其他的坑点:
连乘时要边乘边模,否则会爆long long。
教训:
调用函数时要留意一下参数类型。
Implementation
#include <bits/stdc++.h> using namespace std; const int N{1<<19}, M(1e9+7); typedef long long LL; LL bit[N]; int n; LL pro(int x){ LL res=1; for(; x; res=res*bit[x]%M, x-=x&-x); return res; } void mul(int x, int v){ for(; x&&x<=n; bit[x]=bit[x]*v%M, x+=x&-x); } LL Pow(LL x, int n){ LL res=1; for(; n; x*=x, x%=M, n>>=1) if(n&1) res*=x, res%=M; return res; } LL inv(int x){ return Pow(x, M-2); } int a[N], tail, fa[N][19], dep[N], L[N], R[N]; vector<int> g[N]; void dfs(int u, LL p, int f){ fa[u][0]=f, dep[u]=dep[f]+1; for(int i=1; i<19; i++) fa[u][i]=fa[fa[u][i-1]][i-1]; L[u]=++tail; mul(tail, inv(pro(tail-1))*p%M); for(auto &v:g[u]) if(v!=f) dfs(v, p*a[v]%M, u); R[u]=tail; } int LCA(int u, int v){ if(dep[u]<dep[v]) swap(u, v); int diff=dep[u]-dep[v]; for(int i=0; i<19; i++) if(diff&1<<i) u=fa[u][i]; if(u==v) return u; for(int i=18; i>=0; i--) if(fa[u][i] != fa[v][i]) u=fa[u][i], v=fa[v][i]; return fa[u][0]; } int main(){ cin>>n; for(int i=1; i<=n; i++) scanf("%d", a+i), bit[i]=1; for(int u, v, i=1; i<n; i++) scanf("%d%d", &u, &v), g[u].push_back(v), g[v].push_back(u); dfs(1, a[1], 0); int m; cin>>m; for(int t, u, v; m--; ){ scanf("%d%d%d", &t, &u, &v); if(t==0){ int w=LCA(u, v); LL t=pro(L[w]); LL res=pro(L[u])*pro(L[v])%M*inv(t*t%M)%M*a[w]%M; printf("%lld\n", res); //error-prone } else{ mul(L[u], inv(a[u])*v%M), mul(R[u]+1, a[u]*inv(v)%M), a[u]=v; //error-prone } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee