51nod_1199 树的先跟遍历+区间更新树状数组
题目是中文,所以不讲题意
做法顺序如下:
- 使用先跟遍历,把整棵树平铺到一维平面中
- 使用自己整的区间更新树状数组模板进行相关操作。
- 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 树的先跟遍历+区间更新树状数组的更多相关文章
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- poj3468 A Simple Problem with Integers(线段树区间更新)
https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- HDU3333 Turing Tree 树状数组+离线处理
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 51nod 1681 公共祖先 | 树状数组
51nod 1681 公共祖先 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完 ...
- ural Ambitious Experiment 树状数组
During several decades, scientists from planet Nibiru are working to create an engine that would all ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- 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 ...
随机推荐
- jQuery判断动画是否执行完成
JS $(function() { $("#myDiv").bind("click", function() { if ($(this).css("t ...
- Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n
转载链接:http://blog.csdn.net/tskyfree/article/details/8121951 一.概念: 换行符‘\n’和回车符‘\r’ (1)换行符就是另起一行 --- ' ...
- 符号替换问题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public class Solution { public String replaceSpace(StringBuffer str) { String str1=str.toString(); c ...
- Django组件:用户认证组件
一丶用户认证 1.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: (1).authent ...
- 前端三剑客之javascript
前端三剑客之javascript 给个小目录 一.JavaScript介绍 二.ECMAScript(核心) 三.BOM对象(浏览器对象) 四.DOM对象(文档对象模型) 总结: JS的组成: a ...
- stm8 全局变量定义 声明
1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可.补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的 ...
- Android 关于Acitivity 的setFlag以及launchmode的总结
Intent几种常见的flags: .FLAG_ACTIVITY_NEW_TASK:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Acti ...
- [AngularJS] $location 服务简介
参考博客: https://www.cnblogs.com/gaoruixin/p/6070502.html 简介 $location服务解析在浏览器地址栏中的URL(基于window.locati ...
- koa2实现文件上传服务
使用方法 方法一: 使用中间介 koa-body 方法二: 自己写个借口去接收数据流并保存 方法三: 使用 koa-body 接受文件,自己写个接口做文件保存或处理等操作 这里简单记录方法三 app. ...
- pycharm tab换为4个空格
Edit => find => replace 然后勾上 Regex,上一行输入 \t,下一行输入4个空格.