CF1076E:树状数组 + dfs

CF1076E

题意:给你一棵以1为根的树,每次把以x为根,深度不大于k的点的值全部加上v。最后求每个结点的值。

题解

  • dfs从根开始遍历,那么遍历到每一个点,其深度是确定的。
  • x根的深度为dep,深度不大于k的点都加上v,相当于c[dep] + v,c[dep+k+1]-v,差分处理。
  • 最后x根处理完之后,还有c[dep]-v,c[dep+k+1] + v。因为要遍历其它根,都在同一层,排除这个根的影响。

代码

#include <bits/stdc++.h>
using namespace std;
#define sd second
#define ft first
typedef long long ll;
typedef pair<int,int>pii;
int const N = 300000 + 10;
int n,m;
ll c[N],ans[N];
vector<int>G[N];
vector<pii>p[N];
int lowbit(int x){return x&-x;}
void add(int i,int x){	
	while(i <= N){
		c[i] += x;
		i += lowbit(i);
	}
}
ll query(int i){
	ll sum = 0;
	while(i){
		sum += c[i];
		i -= lowbit(i);
	}
	return sum;
}
void dfs(int u,int fa,int dep){
	for(int i=0;i<p[u].size();i++){
		add(dep,p[u][i].sd);
		add(dep+p[u][i].ft+1,-p[u][i].sd);
	}
	ans[u] = query(dep);
	for(int i=0;i<G[u].size();i++){
		int v = G[u][i];
		if(v == fa)	continue;
		dfs(v,u,dep+1);
	}
	for(int i=0;i<p[u].size();i++){
		add(dep,-p[u][i].sd);
		add(dep+p[u][i].ft+1,p[u][i].sd);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n-1;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		int u,dep,val;  
		scanf("%d%d%d",&u,&dep,&val);
		p[u].push_back(pii(dep,val));
	}
	dfs(1,0,1);
	for(int i=1;i<=n;i++)
		printf("%lld ",ans[i]);
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<--- Last few GCs ---> [11584:0000020B71203B50] 69329 ms: Scavenge (reduce) 2037.9 (2050.3) -> 2037.3 (2051.3) MB, 6.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69339 ms: Scavenge (reduce) 2038.2 (2053.3) -> 2037.6 (2053.3) MB, 3.2 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69348 ms: Scavenge (reduce) 2038.3 (2050.5) -> 2038.1 (2052.0) MB, 3.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure 12: 00007FF6482BAB44 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller+84 13: 00007FF6482BAE43 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithMap+35 14: 00007FF6480C8A10 v8::internal::HashTable<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::EnsureCapacity<v8::internal::Isolate>+208 15: 00007FF6480C6086 v8::internal::Dictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add<v8::internal::Isolate>+102 16: 00007FF6480CF346 v8::internal::BaseNameDictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add+118 17: 00007FF647FC430C v8::internal::Runtime::GetObjectProperty+2204 18: 00007FF64848B50D v8::internal::SetupIsolateDelegate::SetupHeap+463949 19: 00007FF6485017A9 v8::internal::SetupIsolateDelegate::SetupHeap+947945 20: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 21: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 22: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 23: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 24: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 25: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 26: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 27: 0000028E519B08BF
07-22
这段错误堆栈信息显示了一系列垃圾回收(GC)的过程,并且在其中的某个回收过程中发生了分配失败(allocation failure)。这可能是由于内存不足导致的。 垃圾回收是为了回收不再使用的内存空间,并释放给其他对象使用。在这个过程中,通过标记和清除等算法来判断哪些对象是可回收的。 然而,如果在垃圾回收过程中发现内存不足以分配新的对象,就会导致分配失败。这可能是因为系统内存已经达到极限,或者存在内存泄漏等问题。 要解决这个问题,可以尝试以下步骤: 1. 检查代码中是否存在内存泄漏问题:确保没有意外的循环引用或长期保留不必要的对象。 2. 优化代码和算法:检查代码中是否存在低效的内存使用方式,尝试优化算法以减少内存占用。 3. 增加内存限制:如果可能,可以尝试增加系统的内存限制,以提供更多的可用内存。 4. 分析内存使用情况:使用内存分析工具来检查应用程序的内存使用情况,找出是否存在大量占用内存的对象或数据结构。 5. 升级系统或环境:如果你的系统或环境版本较旧,可能存在一些已知的内存管理问题。尝试升级到最新版本以解决这些问题。 如果问题仍然存在,请提供更多的上下文信息、代码示例或其他相关的错误信息,以便更好地理解问题并提供更具体的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值