一个很裸的树链剖分模板。注意一下数据范围,有的地方要开longlong,这就是唯一的陷阱了。

# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
using std::max;
using std::min;
const int mn = 100005;
typedef long long LL;
struct edge{int to,next;};
edge e[mn*2];
int edge_max,head[mn];
void add(int x,int y)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
head[x]=edge_max;
}
int n,m;
int val[mn];
int fa[mn],siz[mn];
void dfs1(int x)
{
siz[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa[x])
continue;
fa[v]=x;
dfs1(v);
siz[x]+=siz[v];
}
}
int tot,id[mn],bl[mn],mx[mn];
void dfs2(int x,int chain)
{
int k=0;
++tot;
id[x]=mx[x]=tot;
bl[x]=chain;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to!=fa[x] && siz[e[i].to]>siz[k])
k=e[i].to;
}
if(k==0)
return ;
dfs2(k,chain);
mx[x]=max(mx[x],mx[k]);
for(int i=head[x];i;i=e[i].next)
{
if(fa[x]!=e[i].to && e[i].to!=k)
{
dfs2(e[i].to,e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
}
}
struct node{int l,r;LL sum,tag;};
node tr[mn*4];
inline void pushdown(int cur)
{
if(tr[cur].tag && tr[cur].l!=tr[cur].r)
{
tr[cur<<1].tag+=tr[cur].tag;
tr[cur<<1|1].tag+=tr[cur].tag;
tr[cur<<1].sum+=(tr[cur<<1].r-tr[cur<<1].l+1)*tr[cur].tag;
tr[cur<<1|1].sum+=(tr[cur<<1|1].r-tr[cur<<1|1].l+1)*tr[cur].tag;
tr[cur].tag=0;
}
}
void build(int l,int r,int cur)
{
tr[cur].l=l,tr[cur].r=r;
if(l==r)
{
return ;
}
int mid=l+r>>1;
build(l,mid,cur<<1);
build(mid+1,r,cur<<1|1);
}
void update(int cur,int l,int r,LL x)//此处要开longlong防止下面爆掉
{
if(tr[cur].r<l || tr[cur].l>r)
return ;
pushdown(cur);
if(tr[cur].l>=l && tr[cur].r<=r)
{
tr[cur].sum+=(tr[cur].r-tr[cur].l+1)*x;//就是这里容易爆掉
tr[cur].tag+=x;
return ;
}
update(cur<<1,l,r,x);
update(cur<<1|1,l,r,x);
tr[cur].sum=tr[cur<<1].sum+tr[cur<<1|1].sum;
}
LL qsum(int cur,int l,int r)
{
if(tr[cur].r<l || tr[cur].l>r)
return 0;
pushdown(cur);
if(tr[cur].l>=l && tr[cur].r<=r)
return tr[cur].sum;
LL tmp=0;
tmp+=qsum(cur<<1,l,r);
tmp+=qsum(cur<<1|1,l,r);
tr[cur].sum=tr[cur<<1].sum+tr[cur<<1|1].sum;
return tmp;
}
void querry(int x)
{
LL ans=0;
while(bl[x]!=1)
{
ans+=qsum(1,id[bl[x]],id[x]);
x=fa[bl[x]];
}
ans+=qsum(1,1,id[x]);
printf("%lld\n",ans);
}
int main()
{
int opt,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(1);
dfs2(1,1);
build(1,n,1);
for(int i=1;i<=n;i++)
update(1,id[i],id[i],val[i]);
for(int i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d",&x,&y);
update(1,id[x],id[x],y*1ll);
}
else if(opt==2)
{
scanf("%d%d",&x,&y);
update(1,id[x],mx[x],y*1ll);
}
else {
scanf("%d",&x);
querry(x);
}
}
return 0;
}

  

BZOJ 4034 洛谷3178 树上操作题解的更多相关文章

  1. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  2. BZOJ 1500 洛谷2042维护序列题解

    BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的 ...

  3. 洛谷P3178 树上操作 [HAOI2015] 树链剖分

    正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  6. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  7. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  8. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. Django项目:CRM(客户关系管理系统)--21--13PerfectCRM实现King_admin分页页数

    {#table_data_list.html#} {## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#} {% extends 'king_m ...

  2. 正则中使用ASCII码,取值范围

    [^\x00-\xFF]  : 表示匹配Ascii码大于255的那些字符 基于浏览器的工具: https://regexr.com/

  3. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--> <context-param> <param-name>web ...

  4. Web基础了解版06-Jsp

    Jsp Jsp全称Java Server Pages,也就是在我们JavaWeb中的动态页面. Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML. Jsp其本质就是一个Se ...

  5. JS文字翻滚效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm ...

  6. 【大数据】Hadoop常用启动命令

    Hadoop常用启停命令 最近在装大数据环境,不知由于年纪大的问题还是笨的缘故,老师记不住一些常用命令,在这里就单独记一下Hadoop常用的启停命令.Hadoop常用的启停命令都在hadoop/sbi ...

  7. MySQL笔记<一>创建数据库和表

    参考博客 https://www.cnblogs.com/sqbk/p/5806797.html https://www.cnblogs.com/tomasman/p/7151962.html

  8. Docker搭建ELK的javaweb应用日志收集存储分析系统

    1.启动elasticsearch docker run -d --name myes -p 9200:9200 elasticsearch:2.3 2.启动kibana docker run --n ...

  9. git中由readme.md文件引发的问题

    在GitHub上建立一个仓库并且添加了readme.txt文件. 无论是push前先将远程仓库pull到本地仓库,还是强制push都会弹出这个问题. Github 禁用了TLS v1.0 and v1 ...

  10. Linux远程管理Windows程序Rdesktop详解

    #rpm –q rdesktop                       //查找是否已经安装 #yum install rdesktop                //使用yum安装 rde ...