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 ...
随机推荐
- 360或其他双核浏览器下在兼容模式用chrome内核渲染的方法
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-COM ...
- D2 前端会议
D2 前端会议 时间 2019年1月6日 图片
- python基础之循环语句
一.if条件语句: 语法: 1.if单分支(单重条件判断) if expression: expr_true_suite 注释:expession为真执行代码expr_true_suite if单分支 ...
- 使用data-自定义数据及如何获取该值
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- It does not do to dwell on dreams and forget to live.
It does not do to dwell on dreams and forget to live.不要过于依赖梦想,却忘了生活.
- Servlet和JavaBean
1.Servlet简介: Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...
- jQuerychicun
jQuery 尺寸 方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() outerWidth() outerHei ...
- Invoke 和 BeginInvoke 的区别(转发)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...
- leetcode 355 Design Twitte
题目连接 https://leetcode.com/problems/design-twitter Design Twitte Description Design a simplified vers ...
- linux 命令——55 traceroute(转)
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...