题目是中文,所以不讲题意

做法顺序如下:

  1. 使用先跟遍历,把整棵树平铺到一维平面中
  2. 使用自己整的区间更新树状数组模板进行相关操作。
  3. http://www.cnblogs.com/rikka/p/7359185.html

放代码如下:

 #include<bits/stdc++.h>

 using namespace std;

 /*
*常量MAXN用于设定树状数组的尺寸大小
*/
const long long MAXN=;
class TreeLikeArray
{
public:
/*
*数组c1用来储存A[i]-A[i-1];
*/
long long c1[MAXN];
/*
*数组c2用来储存(A[i]-A[i-1])*(i-1);
*或认为用于储存(i-1)*c1[i];
*两种实现方式完全等价
*/
long long c2[MAXN];
/*
*树状数组的常规操作,参数要求传入数组并指明更新位置,以及更新参数。
*树状数组基础底层操作
*/
void add(long long array[],long long pos,long long key)
{
while(pos<MAXN)
{
array[pos]+=key;
pos+=pos&(-pos);
}
}
/*
*特别树状数组单点更新操作,要求传入位置和参数
*/
void add(long long pos,long long key)
{ add(c1,pos,key);
add(c1,pos+,-key);
add(c2,pos,(pos-)*key);
add(c2,pos+,-pos*key); }
/*
*特别树状数组多点更新操作,要求传入起始位置、终止位置和参数
*该操作将会使得[pos1,pos2]闭区间内所有元素得到更新
*/
void add(long long pos1,long long pos2,long long key)
{
add(c1,pos1,key);
add(c1,pos2+,-key);
add(c2,pos1,(pos1-)*key);
add(c2,pos2+,-pos2*key);
}
/*
*树状数组的常规操作,参数要求传入数组并指明求和位置
*树状数组基础底层操作
*/
long long getSum(long long array[],long long pos)
{
long long ret=;
while(pos>)
{
ret+=array[pos];
pos-=pos&(-pos);
}return ret;
}
/*
*从起始节点到目标节点闭区间求和[0,i]
*/
long long getSum(long long pos)
{
return pos*getSum(c1,pos)-getSum(c2,pos);
}
/*
*求[pos1,pos2]闭区间内元素和
*/
long long getSum(long long pos1,long long pos2)
{
return getSum(pos2)-getSum(pos1-);
}
/*
*求pos单个元素的值
*/
long long getSingle(long long pos)
{
return getSum(pos,pos);
}
};
TreeLikeArray TLA;
long long mapp[MAXN];
long long son[MAXN];
long long power[MAXN];
vector<long long >G[MAXN];
long long n,m; long long point=;
void dfs(long long x)
{
mapp[x]=point;
for(int i=;i<G[x].size();++i)
{
point++;
dfs(G[x][i]);
}
son[x]=point;
} void init()
{
cin>>n>>m;
for(int i=;i<n;++i)
{
long long a,p;
cin>>a>>p;
G[a].push_back(i);
power[i]=p;
}
dfs();
for(int i=;i<n;++i)
{
TLA.add(mapp[i],power[i]);
}
} int main()
{
cin.sync_with_stdio(false); init();
for(int i=;i<m;++i)
{
char c;
int a,b,z;
cin>>c>>a>>b>>z;
if(c=='S')
{
long long x=TLA.getSingle(mapp[a]);
if(x<b)TLA.add(mapp[a],z);
}else
{
long long summ=TLA.getSum(mapp[a],son[a]);
if(summ<b*(son[a]-mapp[a]+))TLA.add(mapp[a],son[a],z);
}
}
for(int i=;i<n;++i)
{
cout<<TLA.getSingle(mapp[i])<<endl;
} return ;
}

51nod_1199 树的先跟遍历+区间更新树状数组的更多相关文章

  1. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  2. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  3. poj3468 A Simple Problem with Integers(线段树区间更新)

    https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...

  4. 主席树套树状数组——带修区间第k大zoj2112

    主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...

  5. HDU3333 Turing Tree 树状数组+离线处理

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 51nod 1681 公共祖先 | 树状数组

    51nod 1681 公共祖先 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完 ...

  7. ural Ambitious Experiment 树状数组

    During several decades, scientists from planet Nibiru are working to create an engine that would all ...

  8. POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)

    题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...

  9. Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】

    任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...

随机推荐

  1. WebApi 实例

    REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...

  2. JSTL,JQuery,Ajax,Json

    JSTL 的定义  1  JSP 标准标签库 (JavaServerPage Standard Tag Library) 2  JSTL 通常会与EL 表达式合作实现JSP页面的编码   JSTL 的 ...

  3. hibernate课程 初探单表映射3-3 对象类型

    本节简介: 1 简介对象类型(重点是音视频blob类型) 2 demo(对图片的写入数据库与读取) 1 简介对象类型 映射类型 java类型 标准sql类型 mysql类型 oracle类型 bina ...

  4. mysql查询索引

    mysql在使用like查询中,能不能用到索引?在什么地方使用索引呢? 在使用like的时候,如果使用‘%%’,会不会用到索引呢? EXPLAIN SELECT * FROM `user` WHERE ...

  5. 如何进行大规模在线数据迁移(来自Stripe公司的经验)

    首发于笔者的微信公众号:技术心流FollowFlows 原文地址:Stripe Engineering Blog   各工程团队常面临一项共同挑战:重新设计数据模型以支持清晰准确的抽象和更复杂的功能. ...

  6. Android商城开发系列(十三)—— 首页热卖商品布局实现

    热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: <?xml versio ...

  7. springMvc-框架搭建

    搭建springmvc框架的步骤: 1.在web.xml中配置springMvc的servlet 2.创建controller处理页面传来的数据, 3.床架springMvc文件,处理视图: 3.1: ...

  8. hihoCoder #1143 : 骨牌覆盖问题·一 (斐波那契数列)

    题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 思路:这是斐波那契数列啊,f[n] = f[n-1] + f[n-2],初始时 f[ ...

  9. IOS 自定义导航栏背景

    //- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics NS_AV ...

  10. Hystrix + Hystrix Dashboard搭建(Spring Cloud 2.X)

    本机IP为  192.168.1.102 一.搭建Hystrix Dashboard 1.   新建 Maven 项目  hystrix-dashboard 2. pom.xml <projec ...