这题好久之前就被学长安利了...一直没写珍藏在收藏夹一个不为人知的角落233

  这题怎么做...我们来数形结合,横坐标为$t_i$被加的次数(可看作时间$t$),纵坐标为$v_i$,那么$t_i$实际上就是阶梯图形的面积。

  上图是父亲节点和子节点合并后的样子,阴影部分为答案即$t_i$,显然可以通过$deltat*deltav-deltatv$来得到。

  信息下传的时候儿子的$deltatv$加上父亲的$deltatv$后还要加上一个长方体的面积即$deltat_{son}*deltav_{fa}$,然后儿子的$deltat$和$deltav$都加上父亲的就行了。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=, inf=1e9;
struct poi{int too, pre;}e[maxn<<];
struct tjm{ll deltat, deltav, deltatv;}tree[maxn<<];
int n, m, tott, tot, ty, x, y, z;
int fa[maxn], d[maxn], size[maxn], top[maxn], w[maxn], last[maxn], son[maxn];
char buf[], *ptr=buf-;
inline void read(int &k)
{
int f=; k=; char c=*++ptr;
while(c<'' || c>'') c=='-'&&(f=-), c=*++ptr;
while(c<='' && c>='') k=k*+c-'', c=*++ptr;
k*=f;
}
inline void add(int x, int y){e[++tot]=(poi){y, last[x]}; last[x]=tot;}
void dfs1(int x)
{
size[x]=;
for(int i=last[x], too;i;i=e[i].pre)
{
d[too=e[i].too]=d[x]+;
dfs1(too);
size[x]+=size[too];
if(size[too]>size[son[x]]) son[x]=too;
}
}
void dfs2(int x, int tp)
{
top[x]=tp; w[x]=++tott;
if(son[x]) dfs2(son[x], tp);
for(int i=last[x], too;i;i=e[i].pre)
if((too=e[i].too)!=son[x]) dfs2(too, too);
}
inline void addone(int x, ll deltat, ll deltav, ll deltatv)
{
tree[x].deltatv+=deltatv+deltav*tree[x].deltat;
tree[x].deltat+=deltat;
tree[x].deltav+=deltav;
}
inline void down(int x)
{
addone(x<<, tree[x].deltat, tree[x].deltav, tree[x].deltatv);
addone(x<<|, tree[x].deltat, tree[x].deltav, tree[x].deltatv);
tree[x].deltat=tree[x].deltav=tree[x].deltatv=;
}
void update(int x, int l, int r, int cl, int cr, int delta, int ty)
{
if(cl<=l && r<=cr)
{
if(ty) tree[x].deltat+=delta;
else tree[x].deltatv+=tree[x].deltat*delta, tree[x].deltav+=delta;
return;
}
down(x);
int mid=(l+r)>>;
if(cl<=mid) update(x<<, l, mid, cl, cr, delta, ty);
if(cr>mid) update(x<<|, mid+, r, cl, cr, delta, ty);
}
ll query(int x, int l, int r, int cx)
{
if(l==r) return tree[x].deltat*tree[x].deltav-tree[x].deltatv;
down(x);
int mid=(l+r)>>;
if(cx<=mid) return query(x<<, l, mid, cx);
else return query(x<<|, mid+, r, cx);
}
inline void solve(int x, int y, int delta, int ty)
{
int f1=top[x], f2=top[y];
while(f1!=f2)
{
if(d[f1]<d[f2]) swap(x, y), swap(f1, f2);
update(, , n, w[f1], w[x], delta, ty);
x=fa[f1]; f1=top[x];
}
if(d[x]<d[y]) swap(x, y);
update(, , n, w[y], w[x], delta, ty);
}
int main()
{
fread(buf, , sizeof(buf), stdin); read(n);
for(int i=;i<=n;i++) read(fa[i]), add(fa[i], i);
dfs1(); dfs2(, ); read(m);
for(int i=;i<=m;i++) read(ty), read(x), read(y), solve(, x, y, ty-);
for(int i=;i<=n;i++) printf("%lld\n", query(, , n, w[i]));
}

  如果这题要求区间和呢?因为一个区间内可能有很多个阶梯形,但是上传的时候都是接上同样的一段父亲的阶梯,所以这个贡献还是可以计算的,只需要多记录一下区间内的$sumv,sumt$就很好求了。

51nod1462 树据结构(树链剖分+线段树)的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  3. fzu 2082 过路费 (树链剖分+线段树 边权)

    Problem 2082 过路费 Accept: 887    Submit: 2881Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  4. 【bzoj1782】[Usaco2010 Feb]slowdown 慢慢游 树链剖分+线段树

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  5. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  6. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  7. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  8. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  9. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  10. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

随机推荐

  1. python 单体模式 的几种实现

    这是本人的一篇学习笔记. 本文用 python 实现单体模式,参考了这里 一.修改父类的 __dict__ class Borg: _shared_state = {} def __init__(se ...

  2. 手把手教你搭APM之Skywalking搭建指南(支持Java/C#/Node.js)

    前言 什么是APM?全称:Application Performance Management 可以参考这里: 现代APM体系,基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)的体 ...

  3. Security5:授予权限

    SQL Server授予用户访问对象的权限,通常的模式是:Grants permissions on a securable to a principal(user or login),也就是说,授予 ...

  4. 百炼1001: Exponentiation 解题

    链接:http://bailian.openjudge.cn/practice/1001/ 思路 乍一看是很简单的题目,但是答案必须高精度输出,因此需要手动实现一个高精度运算方法.如果直接使用int, ...

  5. IT简历

    对很多IT毕业生来说,写简历投简历是必不可少的.一个好的简历已是面试成功的一半. 简历的目的是为了引人注意,争取让HR主动联系你去面试,不可避免的在简历中掺杂着一些水分,但是能争取到面试机会,再与HR ...

  6. (1) English Learning

    1.  no-brainer 不必花脑筋的事物 This tool is really no-brainer that almost everyone can use it. 这个工具太简单用了,不会 ...

  7. PTA (Advanced Level) 1002 A+B for Polynomials

    1002 A+B for Polynomials This time, you are supposed to find A+B where A and B are two polynomials. ...

  8. POW的重力之美

    定律一:每一个UTXO都保持其状不变,直到有外力迫使它改变这种状态为止--艾萨克•牛顿,原理2.0 在过去的几年里,关于比特币的工作量证明(PoW)所造成的"巨大的能源浪费"已经被 ...

  9. html5实现拖拽上传头像

    1. 将客户端(本地电脑)中的图片拖到网页中 要点: html5 拖放, FileReader html: <div id="container" ondrop=" ...

  10. 12.15daily_scrum

    新的阶段工作已经开始,本阶段我们小组的工作重心在于界面的优化和资源配置的整合,让用户产生更好的体验效果,有一些更加直观和便捷的应用功能展示,加以相应的辅助功能让新版本的笔记本软件更具竞争力和可用性. ...