传送门

时间限制:18000ms
单点时限:2000ms
内存限制:512MB

描述

小h拥有$n$位朋友。每位朋友拥有一个数值$V_i$代表他与小h的亲密度。亲密度有可能发生变化。
岁月流逝,小h的朋友们形成了一种稳定的树状关系。每位朋友恰好对应树上的一个节点。
每次小h想请两位朋友一起聚餐,他都必须把连接两位朋友的路径上的所有朋友都一起邀请上。并且聚餐的花费是这条路径上所有朋友的亲密度乘积。
小h很苦恼,他需要知道每一次聚餐的花销。小h问小y,小y当然会了,他想考考你。

输入

输入文件第一行是一个整数 $n$,表示朋友的数目,从 $1$ 开始编号。
输入文件第二行是 $n$ 个正整数 $V_i$,表示每位朋友的初始的亲密度。
接下来 $n-1$ 行,每行两个整数 $u$ 和 $v$,表示 $u$ 和 $v$ 有一条边。
然后是一个整数 $m$,代表操作的数目。每次操作为两者之一:
$0\ u\ v$ 询问邀请朋友 $u$ 和 $v$ 聚餐的花费

$1\  u\ v$ 改变朋友 $u$ 的亲密度为 $v$

$1\le n,m\le 5\times 10^5$

$V_i\le 10^9$

输出

对于每一次询问操作,你需要输出一个整数,表示聚餐所需的花费。你的答案应该模 $1,000,000,007$ 输出。
样例输入

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序 + 树状数组/线段树,询问和更新复杂度都是 $O(\log{n})$。

对节点 $u$,将根节点到 $u$ 的路径上的点的权值之积维护成前缀积,记作 $pro[u]$。

显然 $u$ 到 $v$ 路径上节点的权值之积可表示为:

\[\dfrac{pro[u] \times pro[v] \times a[lca(u, v)]}{(pro[lca(u, v)])^2},\]

上式中 $a[x]$ 表示节点 $x$ 的权值。

不过我一开始把这个式子搞错了:

\[\dfrac{pro[u]\times pro[v]}{pro[lca(u, v)]}\]

WA了N发,真是太SB了。。。

其他的坑点:

连乘时要边乘边模,否则会爆long long。

教训:

调用函数时要留意一下参数类型。

Implementation

#include <bits/stdc++.h>
using namespace std; const int N{<<}, M(1e9+);
typedef long long LL; LL bit[N];
int n; LL pro(int x){
LL res=;
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=;
for(; n; x*=x, x%=M, n>>=)
if(n&) res*=x, res%=M;
return res;
} LL inv(int x){
return Pow(x, M-);
} int a[N], tail, fa[N][], dep[N], L[N], R[N];
vector<int> g[N]; void dfs(int u, LL p, int f){
fa[u][]=f, dep[u]=dep[f]+;
for(int i=; i<; i++) fa[u][i]=fa[fa[u][i-]][i-];
L[u]=++tail;
mul(tail, inv(pro(tail-))*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=; i<; i++)
if(diff&<<i) u=fa[u][i];
if(u==v) return u;
for(int i=; i>=; i--)
if(fa[u][i] != fa[v][i]) u=fa[u][i], v=fa[v][i];
return fa[u][];
} int main(){
cin>>n;
for(int i=; i<=n; i++)
scanf("%d", a+i), bit[i]=; for(int u, v, i=; i<n; i++)
scanf("%d%d", &u, &v), g[u].push_back(v), g[v].push_back(u);
dfs(, a[], ); int m; cin>>m;
for(int t, u, v; m--; ){
scanf("%d%d%d", &t, &u, &v);
if(t==){
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]+, a[u]*inv(v)%M), a[u]=v; //error-prone
}
}
}

hihocoder 1347 小h的树上的朋友的更多相关文章

  1. hihocoder-1347 小h的树上的朋友(lca+线段树)

    题目链接: 小h的树上的朋友 时间限制:18000ms 单点时限:2000ms 内存限制:512MB 描述 小h拥有n位朋友.每位朋友拥有一个数值Vi代表他与小h的亲密度.亲密度有可能发生变化. 岁月 ...

  2. hihoCoder 1513 小Hi的烦恼

    hihoCoder 1513 小Hi的烦恼 思路: 用bitset判断交集个数 代码: #include<bits/stdc++.h> using namespace std; #defi ...

  3. 【渗透笔记】拿下某小H网的全过程

    自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...

  4. 一个简洁的小H车调运模型

    一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用 ...

  5. hihocoder#1513 : 小Hi的烦恼 bitset

    目录 题目链接 题解 代码 题目链接 hihocoder#1513 : 小Hi的烦恼 题解 cdq 套cdq 套cdq 套cdq就完了呀 对每一科开n个bitset 表示该科目前i个有谁 每次查询都& ...

  6. 小H和密码

    链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1 ...

  7. 【Wannafly挑战赛10 - B】小H和密码(DP)

    试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每 ...

  8. BZOJ1505: [NOI2004]小H的小屋

    BZOJ1505: [NOI2004]小H的小屋 Description 小H发誓要做21世纪最伟大的数学家.他认为,做数学家与做歌星一样,第一步要作好包装,不然本事再大也推不出去. 为此他决定先在自 ...

  9. Wannafly挑战赛10:A题:小H和迷宫

    题目描述       小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使 ...

随机推荐

  1. 安卓开发:效果图中标注的像素尺寸如何转换为安卓的dp尺寸?

    我们的UI基于1920x1080分辨率给的尺寸标注,但是在安卓开发中大家一般都使用dp.sp来标注界面尺寸,所以需要一个dp与sp的转换公式. 一开始参考的的这篇文章:关于Android开发中px.d ...

  2. 谈谈patch strategy

    所谓的patch strategy,就是软件发布后出现bug时打补丁的方式 - 主要是关于源代码branch如何组织的方式 针对项目的开发阶段.开发状态.维护方式不同,可以有不同的patching s ...

  3. 熟悉css/css3颜色属性

    颜色属性无处不在.字体要用颜色,背景可以有颜色,粒子特效更是离不开颜色.本文参考了一些资料简单总结下以备日后查阅. css中颜色的定义方式: 十六进制色 RGB & RGBA HSL & ...

  4. 给Asp.Net MVC及WebApi添加路由优先级

    一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可 ...

  5. PC互联网和移动互联网的本质差别

    网一代,我们先称为PC互联网,这大约可以从2010年作为分界,然后就是基于手机,及可穿戴的移动互联网. 在PC时代,软件都很庞大复杂,甚至客端端和网页混合,比如常见的桌面软件,Office及Photo ...

  6. java list随机打乱

    java list随机打乱package arrlist; import java.util.ArrayList; import java.util.Collections; import java. ...

  7. SQL中的内连接与外连接

    关于关系代数连接运算的介绍请查看下面链接 http://www.cnblogs.com/xidongyu/articles/5980407.html 连接运算格式 链接运算由两部分构成:连接类型和连接 ...

  8. Linux内核参数配置

    Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的. 在/proc/sys目录下存放着大多数的 ...

  9. “Ceph浅析”系列之二——Ceph概况

    本文将对Ceph的基本情况进行概要介绍,以期读者能够在不涉及技术细节的情况下对Ceph建立一个初步印象. 1. 什么是Ceph? Ceph的官方网站Ceph.com上用如下这句话简明扼要地定义了Cep ...

  10. 美发屋App-业余爱好

    出于个人爱好, 自行设计了一款APP,由于时间有限,APP目前只做了3天,现大四,急求一份实习工作,月薪3K左右即可! 软件UI设计到编码,全部又我一人完成,所以工作量比较大 底部采用·Fragmen ...