题目是中文,所以不讲题意
做法顺序如下:
- 使用先跟遍历,把整棵树平铺到一维平面中
- 使用自己整的区间更新树状数组模板进行相关操作。
- 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 ;
}