P3925 aaa被续

题目描述没看懂(雾)

简单解释一下:

对于节点\(u\),将子树\(u\)中的权值从大到小排序,记“权值乘排名之和”为\(u\)的贡献。

输出总贡献。


下文定义\(w[u]\)为\(u\)的权值,\(siz[u]\)为子树\(u\)的大小。

考虑每个节点对答案的贡献,看起来比较困难。

转而考虑每个权值对答案的贡献。

不难发现,如果将子树\(u\)中的节点按权值从大到小排序,那么这些点的排名依次是\(siz[u],siz[u]-1,\dots,1\)。

所以我们按权值从大到小遍历每个节点。需要统计它的贡献的节点,就是它到根节点路径上的所有节点。

遍历这些节点,在\(v\)点累加的贡献是\(siz[v]\times w[u]\),并且将\(siz[v]\)减去\(1\)。

这样,\(siz[v]\)表示的始终是\(u\)在子树\(v\)中的排名。因为我们的节点是按权值从大到小统计的。

因此我们需要支持的操作:

  • 将\(u\)到根节点路径上的\(siz\)统一减去\(1\)。
  • 统计\(u\)到根节点的\(siz\)之和(将所求的和\(\times w[u]\)累入答案即可)。

可以用树剖实现。

时间复杂度\(O(n\log^2 n)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N=5e5+10,P=1e9+7;
int n,head[N],fa[N],dep[N],siz[N],son[N],top[N],dfn[N],tim,w[N],idx;
ll ans;
struct edge{int nxt,to;}e[N<<1];
void add(int u,int v){e[++idx]={head[u],v},head[u]=idx;}
inline int lb(int x){return x&-x;}
struct BIT{
int s1[N],s2[N];
void chp(int x,int v){
for(int i=x;i<=n;i+=lb(i)) s1[i]+=v,s2[i]+=v*x;
}
void chr(int x,int y,int v){
chp(x,v),chp(y+1,-v);
}
int query(int x){
int ans=0;
for(int i=x;i;i-=lb(i)) ans+=(x+1)*s1[i]-s2[i];
return ans;
}
int query(int x,int y){
return query(y)-query(x-1);
}
}bit;
struct Node{
int p,w;
}p[N];
void dfs1(int u){
siz[u]=1,dep[u]=dep[fa[u]]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]) continue;
fa[v]=u,dfs1(v),siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t,dfn[u]=++tim,bit.chr(dfn[u],dfn[u],siz[u]);
if(!son[u]) return;
dfs2(son[u],t);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
}
}
void ch_chain(int u,int v,int iv){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
bit.chr(dfn[top[u]],dfn[u],iv);
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
bit.chr(dfn[v],dfn[u],iv);
}
ll query(int u,int v){
ll ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=bit.query(dfn[top[u]],dfn[u]);
ans%=P;
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans+=bit.query(dfn[v],dfn[u]);
return ans%P;
}
signed main(){
cin>>n;
for(int i=1,u,v;i<n;i++) cin>>u>>v,add(u,v),add(v,u);
for(int i=1;i<=n;i++) cin>>w[i],p[i]={i,w[i]};
dfs1(1),dfs2(1,1);
sort(p+1,p+1+n,[](Node a,Node b){return a.w>b.w;});
for(int i=1;i<=n;i++){
(ans+=query(1,p[i].p)%P*p[i].w)%=P;
ch_chain(1,p[i].p,-1);
}
cout<<ans<<"\n";
return 0;
}

[题解]P4116 Qtree3的更多相关文章

  1. [题解]luogu P4116 Qtree3

    终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...

  2. P4116 Qtree3

    思路 可以树剖可以LCT,树剖就是每个重链开一个SET维护一下黑点的深度 非常不优美 使用LCT,在splay上二分找出需要的节点即可 代码 #include <cstdio> #incl ...

  3. 洛谷 P4116 Qtree3

    Qtree系列第三题 我是题面 读完题大概不难判断是一道树剖的题 这道题的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表 ...

  4. 洛谷P4116 Qtree3

    题目描述 给出\(N\)个点的一棵树(\(N-1\)条边),节点有白有黑,初始全为白 有两种操作: \(0\) \(i\) : 改变某点的颜色(原来是黑的变白,原来是白的变黑) \(1\) \(v\) ...

  5. 洛谷P4116 Qtree3(树剖+线段树)

    传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 / ...

  6. 题解【QTree3】

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  7. luogu P4116 Qtree3

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  8. Qtree3题解(树链剖分(伪)+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...

  9. Qtree3题解(树链剖分+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...

  10. 【洛谷 P4116】 Qtree3 (树链剖分)

    题目链接 树剖练手题,想复习下树剖. 第一次提交\(T\)成QQC 看我 ??? 看了数据范围的确挺恶心的,我的复杂度是\(O(Mlog^2N)\)的,数据范围有三段 For 1/3 of the t ...

随机推荐

  1. Git回滚命令reset|回退代码到某次commit

    摘要:使用Git回退命令reset回退代码到某次commit.   需求背景: 需要回滚提交的代码的场景常常是如下三个: 提交代码到错误Git分支: 提交的代码不需要上线了,而同一分支有需要上线的代码 ...

  2. 记录一次自己用 AI 写IOS APP的经历

    我是几乎没有移动端开发经验的.仅有的一点安卓开发经验还是十几年前没毕业的时候自己瞎折腾. 故事的起源是每天辅导我儿子功课时的暴跳如雷. 我儿子上一年级了,在语文的生词上落后得非常严重(当然可能是他同学 ...

  3. 「Note」模板速查

    代码 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long l ...

  4. 国产自研、安全、高可用——袋鼠云大数据基础平台EasyMR筑基企业数字化转型

    近年来,国际形势的风云变幻,中美双边关系的恶化,自2013年"棱镜门"事件之后,又一次警示国人,对于科技领域,只有自己掌握核心关键技术,实现自主可控,才能摆脱越来越频繁的" ...

  5. IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized

    *************************** APPLICATION FAILED TO START *************************** Description: Bin ...

  6. 《Building REST APIs with Flask》读后感

    一. 为什么读这本书? 之所以选择这本书其实是因为最近自己在梳理 JWT 的用法.自己曾参与过的一个项目虽然使用的是 Flask 开发,但是授权使用的 PyJWT,当时以为使用 PyJWT 是行业通用 ...

  7. java--Hibernate查询、连接池、二级缓存

    hibernate查询 1) Get/load主键查询 2) 对象导航查询 3) HQL查询, Hibernate Query language hibernate 提供的面向对象的查询语言. 4) ...

  8. Atlas启动报错:Caused by: org.apache.solr.common.SolrException: Cannot connect to cluster at xxx.com:2181: cluster not found/not ready

    Atlas启动时报以下错误,看情况是atlas没有在zk上找到solr注册信息:然后发现solr启动命令bin/solr start -force会默认使用内置的zk,不会往公共zk上面注册: 解决方 ...

  9. pdf渲染和对比 react-pdf-highlighter

    前言 react-pdf-highlighter 使用此插件 做pdf的预览 高亮 批注 对比等 效果 地址 https://github.com/dingshaohua-cn/pdf-highlig ...

  10. 前端开发系列128-进阶篇之template compile

    最近有个朋友问<%=...%> 和 {{ Mustache }} 插值语法的一些问题,突然想起以前使用<%=...%>语法进行模板编译的日子,似乎已经很久远了,刚好有点时间所以 ...