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

做法顺序如下:

  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. jQuery判断动画是否执行完成

    JS $(function() { $("#myDiv").bind("click", function() { if ($(this).css("t ...

  2. Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n

    转载链接:http://blog.csdn.net/tskyfree/article/details/8121951 一.概念: 换行符‘\n’和回车符‘\r’ (1)换行符就是另起一行  --- ' ...

  3. 符号替换问题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    public class Solution { public String replaceSpace(StringBuffer str) { String str1=str.toString(); c ...

  4. Django组件:用户认证组件

    一丶用户认证 1.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: (1).authent ...

  5. 前端三剑客之javascript

    前端三剑客之javascript 给个小目录  一.JavaScript介绍  二.ECMAScript(核心) 三.BOM对象(浏览器对象) 四.DOM对象(文档对象模型) 总结: JS的组成: a ...

  6. stm8 全局变量定义 声明

    1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可.补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的 ...

  7. Android 关于Acitivity 的setFlag以及launchmode的总结

    Intent几种常见的flags: .FLAG_ACTIVITY_NEW_TASK:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Acti ...

  8. [AngularJS] $location 服务简介

    参考博客:  https://www.cnblogs.com/gaoruixin/p/6070502.html 简介 $location服务解析在浏览器地址栏中的URL(基于window.locati ...

  9. koa2实现文件上传服务

    使用方法 方法一: 使用中间介 koa-body 方法二: 自己写个借口去接收数据流并保存 方法三: 使用 koa-body 接受文件,自己写个接口做文件保存或处理等操作 这里简单记录方法三 app. ...

  10. pycharm tab换为4个空格

    Edit => find => replace 然后勾上 Regex,上一行输入 \t,下一行输入4个空格.