【dfs序】【set】bzoj3991 [Sdoi2015]寻宝游戏

本文介绍了一种基于虚树的数据结构算法,用于解决涉及树形结构的动态距离计算问题。通过预处理得到轻重链剖分、离线查询等操作,实现在节点增删时快速更新所有节点间的距离和。代码实现基于C++,详细展示了如何构建虚树并进行高效的插入与删除操作。

在考试代码的基础上稍微改改就a了……当时为什么不稍微多想想……

插入/删除一个新节点时就把其dfn插入set/从set中删除。

当前的答案就是dfn上相邻的两两节点的距离和,再加上首尾节点的距离。

比较显然?不会证明……

貌似叫“虚树”?

#include<cstdio>
#include<set>
using namespace std;
#define N 100001
typedef long long ll;
set<int>S;
typedef set<int>::iterator ER;
int n,m;
int v[N<<1],first[N],next[N<<1],w[N<<1],en;
void AddEdge(int U,int V,int W)
{
	v[++en]=V;
	w[en]=W;
	next[en]=first[U];
	first[U]=en;
}
int top[N],dep[N],fa[N],siz[N],son[N],dfn[N],Map[N];
ll sumv[N],ans;
bool a[N];
void dfs(int U)
{
	siz[U]=1;
	for(int i=first[U];i;i=next[i])
	  if(v[i]!=fa[U])
	    {
	      fa[v[i]]=U;
	      dep[v[i]]=dep[U]+1;
	      sumv[v[i]]=sumv[U]+(ll)w[i];
	      dfs(v[i]);
	      siz[U]+=siz[v[i]];
	      if(siz[v[i]]>siz[son[U]])
	        son[U]=v[i];
	    }
}
void df2(int U)
{
	dfn[U]=++en;
	Map[en]=U;
	if(son[U])
	  {
	  	top[son[U]]=top[U];
	  	df2(son[U]);
	  }
	for(int i=first[U];i;i=next[i])
	  if(v[i]!=fa[U]&&v[i]!=son[U])
	    {
	      top[v[i]]=v[i];
	      df2(v[i]);
	    }
}
int lca(int U,int V)
{
	while(top[U]!=top[V])
	  {
	  	if(dep[top[U]]<dep[top[V]])
	  	  swap(U,V);
	  	U=fa[top[U]];
	  }
	if(dep[U]>dep[V])
	  swap(U,V);
	return U;
}
ll Query(int U,int V)
{
	return sumv[U]+sumv[V]-(sumv[lca(U,V)]<<1);
}
int main()
{
	int x,y,z;
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;++i)
	  {
	  	scanf("%d%d%d",&x,&y,&z);
	  	AddEdge(x,y,z);
	  	AddEdge(y,x,z);
	  }
	en=0;
	top[1]=1;
	dfs(1);
	df2(1);
	for(;m;--m)
	  {
	  	scanf("%d",&x);
	  	a[x]^=1;
	  	if(a[x])
	  	  {
	  	  	S.insert(dfn[x]);
	  	  	ER it=S.end(); --it;
	  	  	ER jt=S.begin();
	  	  	if(S.size()==0||S.size()==1) ans=0;
	  	  	if(S.size()==2)
	  	  	  ans=(Query(Map[*jt],Map[*it])<<1);
	  	  	else if(S.size()>2&&(*jt)==dfn[x])
	  	  	  {
	  	  	  	ans+=Query(Map[*jt],Map[*it]);
	  	  	  	ER kt=jt; ++kt;
	  	  	  	ans+=Query(Map[*jt],Map[*kt]);
	  	  	  	ans-=Query(Map[*kt],Map[*it]);
	  	  	  }
	  	  	else if(S.size()>2&&(*it)==dfn[x])
	  	  	  {
	  	  	  	ans+=Query(Map[*jt],Map[*it]);
	  	  	  	ER kt=it; --kt;
	  	  	  	ans+=Query(Map[*it],Map[*kt]);
	  	  	  	ans-=Query(Map[*kt],Map[*jt]);
	  	  	  }
	  	  	else if(S.size()>2)
	  	  	  {
	  	  	  	ER kt=S.find(dfn[x]);
	  	  	  	ER lt=kt; --lt;
	  	  	  	ER mt=kt; ++mt;
	  	  	  	ans+=Query(Map[*lt],Map[*kt]);
	  	  	  	ans+=Query(Map[*kt],Map[*mt]);
	  	  	  	ans-=Query(Map[*lt],Map[*mt]);
	  	  	  }
	  	  }
	  	else
	  	  {
	  	  	ER it=S.end(); --it;
	  	  	ER jt=S.begin();
	  	  	if(S.size()==0||S.size()==1) ans=0;
	  	  	if(S.size()==2)
	  	  	  ans=(Query(Map[*jt],Map[*it])<<1);
	  	  	else if(S.size()>2&&(*jt)==dfn[x])
	  	  	  {
	  	  	  	ans-=Query(Map[*jt],Map[*it]);
	  	  	  	ER kt=jt; ++kt;
	  	  	  	ans-=Query(Map[*jt],Map[*kt]);
	  	  	  	ans+=Query(Map[*kt],Map[*it]);
	  	  	  }
	  	  	else if(S.size()>2&&(*it)==dfn[x])
	  	  	  {
	  	  	  	ans-=Query(Map[*jt],Map[*it]);
	  	  	  	ER kt=it; --kt;
	  	  	  	ans-=Query(Map[*it],Map[*kt]);
	  	  	  	ans+=Query(Map[*kt],Map[*jt]);
	  	  	  }
	  	  	else if(S.size()>2)
	  	  	  {
	  	  	  	ER kt=S.find(dfn[x]);
	  	  	  	ER lt=kt; --lt;
	  	  	  	ER mt=kt; ++mt;
	  	  	  	ans-=Query(Map[*lt],Map[*kt]);
	  	  	  	ans-=Query(Map[*kt],Map[*mt]);
	  	  	  	ans+=Query(Map[*lt],Map[*mt]);
	  	  	  }
	  	  	S.erase(dfn[x]);
	  	  }
	  	printf("%lld\n",ans);
	  }
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/4429009.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值