洛谷题目传送门

仍然是一个板子。

不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀

设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\sum\limits_ {j=1}^ia_ j\)

显然有\(a_ i=\sum\limits_ {j=1}^id_ j\)

于是大力展开得到

\[s_i=\sum\limits_{j=1}^i(i-j+1)d_j
\]

\[s_i=(i+1)\sum\limits_{i=1}^jd_j-\sum\limits_{j=1}^ijd_j
\]

用BIT维护\(d_i\)和\(id_i\)的前缀和即可。

#include<cstdio>
#define RG register
#define R RG int
#define G if(++ip==ie)fread (ip=ibuf,1,L,stdin)
#define P(C) *op=C;if(++op==oe)fwrite(op=obuf,1,L,stdout)
typedef long long LL;
const int N=1e5+9,M=N<<1,L=1<<19;
char ibuf[L],*ie=ibuf+L,*ip=ie-1,obuf[L],*oe=obuf+L,*op=obuf;
int YL,n,p,a[N],he[N],ne[M],to[M],f[N],s[N],id[N],pr[N],dep[N],top[N],d[N],e[N];
inline int in(){
G;while(*ip<'-')G;
R x=*ip&15;G;
while(*ip>'-'){(x*=10)+=*ip&15;G;}
return x;
}
void out(R x){
if(x>9)out(x/10);
P(x%10|'0');
}
inline void swap(R&x,R&y){
R z=x;x=y;y=z;
}
void dfs1(R x,R y){
s[x]=1;
dep[x]=dep[f[x]=y]+1;
for(R i=he[x];i;i=ne[i])
if(to[i]!=y)dfs1(to[i],x);
s[y]+=s[x];
if(s[pr[y]]<s[x])pr[y]=x;
}
void dfs2(R x,R y){
top[x]=y;
d[id[x]=++p]=a[x];
if(!pr[x])return;
dfs2(pr[x],y);
for(R i=he[x];i;i=ne[i])
if(!id[to[i]])dfs2(to[i],to[i]);
}
inline void mdf(R*d,R i,R v){
for(;i<=n;i+=i&-i)(d[i]+=v)%=YL;
}
inline void upd(R l,R r,R v){
mdf(d,l,v);mdf(e,l,(LL)v*l%YL);v=YL-v;
mdf(d,r,v);mdf(e,r,(LL)v*r%YL);
}
inline int qry(R*d,R i){
R v=0;
for(;i;i-=i&-i)(v+=d[i])%=YL;
return v;
}
inline int ask(R l,R r){
return (((LL)(r+1)*qry(d,r)-qry(e,r)-(LL)(l+1)*qry(d,l)+qry(e,l))%YL+YL)%YL;
}
int main(){
n=in();R m=in(),rt=in(),i,x,y,z,ans;YL=in();
for(i=1;i<=n;++i)a[i]=in();
for(i=1;i<n;++i){
x=in();y=in();
ne[++p]=he[x];to[he[x]=p]=y;
ne[++p]=he[y];to[he[y]=p]=x;
}
p=0;dfs1(rt,0);dfs2(rt,rt);
for(i=n;i;--i){
d[i]=((d[i]-d[i-1])%YL+YL)%YL;
e[i]=(LL)i*d[i]%YL;
}
for(i=1;i<=n;++i){
if((x=i+(i&-i))>n)continue;
(d[x]+=d[i])%=YL;(e[x]+=e[i])%=YL;
}
while(m--)
switch(in()){
case 1:x=in();y=in();z=in()%YL;
for(;top[x]!=top[y];x=f[top[x]]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
upd(id[top[x]],id[x]+1,z);
}
if(dep[x]<dep[y])swap(x,y);
upd(id[y],id[x]+1,z);
break;
case 2:x=in();y=in();ans=0;
for(;top[x]!=top[y];x=f[top[x]]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=ask(id[top[x]]-1,id[x]);
}
if(dep[x]<dep[y])swap(x,y);
out((ans+ask(id[y]-1,id[x]))%YL);P('\n');
break;
case 3:x=in();z=in()%YL;
upd(id[x],id[x]+s[x],z);
break;
case 4:x=in();
out(ask(id[x]-1,id[x]+s[x]-1));P('\n');
}
fwrite(obuf,1,op-obuf,stdout);
return 0;
}

树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)的更多相关文章

  1. 树链剖分模板(洛谷P3384)

    洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...

  2. [洛谷P3384] [模板] 树链剖分

    题目传送门 显然是一道模板题. 然而索引出现了错误,狂wa不止. 感谢神犇Dr_J指正.%%%orz. 建线段树的时候,第44行. 把sum[p]=bv[pos[l]]%mod;打成了sum[p]=b ...

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

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

  4. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  5. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  6. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  7. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

  8. 洛谷 P4125 [WC2012]记忆中的水杉树【扫描线+set+线段树】

    我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问, ...

  9. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

  10. 【树链剖分】洛谷P3384树剖模板

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

随机推荐

  1. DNS 协议

    DNS 入门 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS 使用 T ...

  2. 使用odoo官方dockerfile 创建最新版镜像

    以odoo11.0为例 1.检出odoo/docker仓:git clone https://github.com/odoo/docker.git 2.打开目录 http://nightly.odoo ...

  3. phpstorm 2018.1.2的安装和破解

    1.什么是phpstorm? PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查.但是phpstorm是商业软件, ...

  4. [Oacle][Partition]Partition操作与 Index, Global Index 的关系

    [Oacle][Partition]Partition操作与 Index, Global Index 的关系: ■ Regarding the local index and the global i ...

  5. NFS共享文件系统部署

    1. 概述 本篇博客主要是介绍如何安装和使用NFS服务. 2. 安装软件包 首先确认系统是否已经安装相应的软件包,执行命:rpm -qa | egrep "rpcbind|nfs-utils ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

  7. Jmeter(三十五)_精确实现网页爬虫

    Jmeter实现了一个网站文章的爬虫,可以把所有文章分类保存到本地文件中,并以文章标题命名 它原理就是对网页提交一个请求,然后把返回的所有值提取出来,利用ForEach控制器去实现遍历.下面来介绍一下 ...

  8. Linux下绑定网卡的操作记录

    公司采购的服务器安装了双网卡,并进行bond网卡绑定设置,网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6. 第一种模式:mod= ...

  9. iOS APP 中H5视频默认全屏播放问题解决

    问题描述:在Android中,视频可以正常在H5页面局部播放,iOS中则自动切换至全屏模式. 查看资料得以解决,20190301记录下来. 解决方法:IOS10及以后,在 video标签页中只包含 w ...

  10. 对我们最常用的软件QQ的看法

    QQ聊天软件是我使用的第一款聊天软件,早在我上小学6年级的时候就开始接触这款软件了,可以说是陪伴我最久的一款软件. 相对于其他的聊天软件,QQ更加的方便,使用简单,界面也好操作,所以我爱上了这款软件. ...