题目链接 https://www.luogu.org/problemnew/show/P3384

【描述】

树链剖分模板题,记一下板子

#include<bits/stdc++.h>
#define node tree[id]
#define lson tree[id<<1]
#define rson tree[id<<1|1]
using namespace std;const int maxn=100005;struct Edge{int to,next;
};struct Tree{int left,right,len;long long lazy,sum;
};int n,m,rt,tot;
long long mod;
long long w[maxn];
int f[maxn],d[maxn],num[maxn],son[maxn];
int id[maxn],eid[maxn],rk[maxn],top[maxn],cnt;int head[maxn];
Edge edges[maxn<<1];
Tree tree[maxn<<2];void addedge(int from,int to){edges[++tot].to=to;edges[tot].next=head[from];head[from]=tot;
}void dfs(int u,int fa,int dep){f[u]=fa;d[u]=dep;num[u]=1;for(int i=head[u];i;i=edges[i].next){int v=edges[i].to;if(v!=fa){dfs(v,u,dep+1);num[u]+=num[v];if(num[son[u]]<num[v]) son[u]=v;}}
}void dfs2(int u,int t){top[u]=t;id[u]=++cnt;rk[cnt]=u;if(son[u]){dfs2(son[u],t);for(int i=head[u];i;i=edges[i].next){int v=edges[i].to;if(v!=f[u] && v!=son[u]) dfs2(v,v);}}eid[u]=cnt;
}void pushup(int id){node.sum=(lson.sum+rson.sum)%mod;}void pushdown(int id){if(node.lazy && node.left!=node.right){lson.sum=(lson.sum+node.lazy*lson.len)%mod;lson.lazy+=node.lazy;rson.sum=(rson.sum+node.lazy*rson.len)%mod;rson.lazy+=node.lazy;node.lazy=0;}
}void build(int id,int le,int ri){node.left=le;node.right=ri;node.len=ri-le+1;node.lazy=0;if(le==ri){node.sum=w[rk[le]];return;}int mid=(le+ri)>>1;build(id<<1,le,mid);build(id<<1|1,mid+1,ri);pushup(id);
}long long query(int id,int le,int ri){if(node.left==le && node.right==ri){return node.sum;}pushdown(id);int mid=(node.left+node.right)>>1;if(ri<=mid) return query(id<<1,le,ri);else if(le>mid) return query(id<<1|1,le,ri);else return (query(id<<1,le,mid)+query(id<<1|1,mid+1,ri))%mod;
}void update(int id,int le,int ri,long long val){if(node.left==le && node.right==ri){node.sum=(node.sum+val*node.len)%mod;node.lazy+=val;return;}pushdown(id);int mid=(node.left+node.right)>>1;if(ri<=mid) update(id<<1,le,ri,val);else if(le>mid) update(id<<1|1,le,ri,val);else{update(id<<1,le,mid,val);update(id<<1|1,mid+1,ri,val);}pushup(id);
}void add(int x,int y,long long z){while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);update(1,id[top[x]],id[x],z);x=f[top[x]];}if(d[x]>d[y]) swap(x,y);update(1,id[x],id[y],z);
}long long sum(int x,int y){long long ans=0;while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);ans=(ans+query(1,id[top[x]],id[x]))%mod;x=f[top[x]];}if(d[x]>d[y]) swap(x,y);ans=(ans+query(1,id[x],id[y]))%mod;return ans;
}int main(){scanf("%d%d%d%lld",&n,&m,&rt,&mod);for(int i=1;i<=n;++i) scanf("%lld",&w[i]);for(int i=0;i<n-1;++i){int u,v;scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}dfs(rt,0,0);dfs2(rt,rt);build(1,1,n);while(m--){int op,x,y;long long z;scanf("%d",&op);if(op==1){scanf("%d%d%lld",&x,&y,&z);add(x,y,z);}else if(op==2){scanf("%d%d",&x,&y);printf("%lld\n",sum(x,y));}else if(op==3){scanf("%d%lld",&x,&z);update(1,id[x],eid[x],z);}else if(op==4){scanf("%d",&x);printf("%lld\n",query(1,id[x],eid[x]));}}return 0;
}

洛谷P3384 - 树链剖分(树链剖分模板题)相关推荐

  1. 洛谷P1536村村通(并查集模板题)

    问题出处: https://www.luogu.com.cn/problem/P1536 题目描述: 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 " ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  4. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

  5. U81206:链式前向星模板题

    [题目来源] https://www.luogu.com.cn/problem/U81206 [题目描述] 链式前向星模板题. 读入n个点,m条边,以及flag.若flag==1,则图有向,否则无向. ...

  6. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  7. 洛谷(P3373)线段树加乘混合模板

    题目链接:P3373 [模板]线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题目的意思很明确,就是要我们在线完成区间的乘和加运算并支持查询区间和的一个问题.处理这道 ...

  8. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  9. 洛谷 P2495 [SDOI2011]消耗战 虚树

    题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

最新文章

  1. R语言:如何快速生成许多差异明显的颜色?
  2. Linux大神必会操作——系统排错
  3. Servlet-监听器(ServletContext、Request、Session)
  4. loj #143. 质数判定
  5. [转载]Yacc基础
  6. OpenFiler 配置iscsi共享式存储
  7. boost::get_deleter相关的测试程序
  8. LeetCode之字符串(C++)的切割简单实现
  9. 详解volatile关键字
  10. MyEclipse/Eclipse 中使用javap
  11. 配置dns的三种方式
  12. MySQL 排名函数.md
  13. python搭建邮件服务器地址_python 配置邮件发送服务器发送邮件
  14. 场景:如果一个select下拉框的值被选中,其他两个字段值的校验也生效
  15. python快速编程入门课本中的名片管理器_Python-名片管理器
  16. 1001:Hello,World! 信息学奥赛一本通c++版在线评测系统
  17. 微信 朋友圈 缩略图 php,Wordpress分享微信朋友圈缩略图设置 | 听可科技|TMC
  18. android投屏!Android开发还会吃香吗?挥泪整理面经
  19. python-Counter计数函数以及most_common函数
  20. 理解嵌入式系统中基本的语音算法

热门文章

  1. html浏览器不能自动播放MP3音乐的问题
  2. HBuilder安装SVN插件
  3. Manjaro安装YCM
  4. Rabbitmq中常用的五种连接方式
  5. #千锋逆战班,ssf# 在千锋“逆战”学习第 24天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油
  6. 软注意力机制和硬注意力机制
  7. 5教程 watchout_小课题研究个人小结-浅议如何用图片法加强词汇教学
  8. idea的头注释@author、@time设置
  9. redis的zset的底层实现_深入理解Redis Zset原理
  10. oracle未明确定义列