样例输入

4 5
1 2 30
2 3 50
2 4 60
2
3
4
2
1

样例输出

0
100
220
220
280

提示

题解

本题不断增删关键点,而且有一个显而易见的结论:不管从哪个点出发,每条路径都会走两遍。我们可以维护一棵动态虚树,记录虚树中的路径总长。具体实现需要开一个DFS序的set,增删点类比建虚树过程即可。

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a,b,c,n,m,ans,cnt,Last[maxn];
ll vt,lca,id[maxn],dep[maxn],dfn[maxn],dis[maxn],fa[maxn][20];
set<ll> cache;
struct node
{ll End,Next,Len;
}edge[2*maxn];
void save(ll x,ll y,ll z)
{edge[++cnt].End=y,edge[cnt].Len=z;edge[cnt].Next=Last[x],Last[x]=cnt;
}
void DFS(ll x)
{dep[x]=dep[fa[x][0]]+1;dfn[x]=++vt,id[vt]=x;ll s=ceil(log2(dep[x]));for(ll i=1;i<=s;i++) fa[x][i]=fa[fa[x][i-1]][i-1];for(ll i=Last[x];i;i=edge[i].Next){ll y=edge[i].End;if(y==fa[x][0]) continue;fa[y][0]=x,dis[y]=dis[x]+edge[i].Len;DFS(y);}
}
ll getlca(ll x,ll y)
{if(dep[x]<dep[y]) swap(x,y);ll k=dep[x]-dep[y],s=ceil(log2(n));for(ll i=0;i<=s;i++)if(k&(1<<i)) x=fa[x][i];if(x==y) return x;k=ceil(log2(dep[x]));for(ll i=k;i>=0;i--)if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];return fa[x][0];
}
ll pre(ll x)
{set<ll>::iterator y=cache.find(dfn[x]);if(y==cache.begin()) return 0;return id[*(--y)];
}
ll las(ll x)
{set<ll>::iterator y=cache.find(dfn[x]);y++;if(y==cache.end()) return 0;return id[*y];
}
void clr(ll x)
{ll l=pre(x),r=las(x);if(l) lca=getlca(x,l),ans-=dis[x]+dis[l]-2*dis[lca];if(r) lca=getlca(x,r),ans-=dis[x]+dis[r]-2*dis[lca];if(l&&r) lca=getlca(r,l),ans+=dis[r]+dis[l]-2*dis[lca];cache.erase(dfn[x]);
}
void ins(ll x)
{cache.insert(dfn[x]);ll l=pre(x),r=las(x);if(l) lca=getlca(x,l),ans+=dis[x]+dis[l]-2*dis[lca];if(r) lca=getlca(x,r),ans+=dis[x]+dis[r]-2*dis[lca];if(l&&r) lca=getlca(r,l),ans-=dis[r]+dis[l]-2*dis[lca];
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<n;i++){scanf("%lld%lld%lld",&a,&b,&c);save(a,b,c),save(b,a,c);}DFS(1);while(m--){scanf("%lld",&a);if(!cache.size()) cache.insert(dfn[a]),puts("0");else{if(cache.find(dfn[a])!=cache.end()) clr(a);else ins(a);lca=getlca(id[*cache.begin()],id[*(--cache.end())]);printf("%lld\n",ans+dis[id[*cache.begin()]]+dis[id[*(--cache.end())]]-2*dis[lca]);}}return 0;
}

【SDOI2015】寻宝游戏相关推荐

  1. SDOI2015寻宝游戏 dfs序+set

    SDOI2015寻宝游戏 好像是一道虚树入门题? 虚树???不会不会我弱死了.. Solution: 关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径. 基于这个思 ...

  2. 【BZOJ 3991】 [SDOI2015]寻宝游戏

    3991: [SDOI2015]寻宝游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 251 Solved: 137 [Submit][Status ...

  3. BZOJ 3991: [SDOI2015]寻宝游戏

    随便选一个点当做根,跑每个点的深度(为了求LCA)d [ u ] ,和到根节点的距离(为了更新答案) l [ u ] 我们发现,由关键点和他们的LCA构成的虚树(其实就是忽略其他节点),由于还要回到原 ...

  4. 洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)

    被\(STL\)坑害了一个晚上,真的菜的没救了啊. 准确的说是一个叫\(reverse\ iterator\)的东西,就是我们经常用的\(rbegin()\) 有一个非常重要的性质 在反向迭代器中,+ ...

  5. 【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set

    题目描述 给出一棵树,初始每个点都是非必经的.多次改变某个点的必经状态,并询问从任意一个点出发,经过所有必经的点并回到该点的最小路程. 输入 第一行,两个整数N.M,其中M为宝物的变动次数. 接下来的 ...

  6. 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏

    题目传送门:LOJ #2182. 题意简述: 一棵 \(n\) 个节点的树,边有边权. 每个点可能是关键点,每次操作改变一个点是否是关键点. 求所有关键点形成的极小联通子树的边权和的两倍. 题解: 有 ...

  7. 【SDOI2015】【BZOJ3991】寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...

  8. 河北工业大学c语言寻宝游戏,计算机技术基础(c语言)课程设计寻宝游戏.doc

    计算机技术基础(c语言)课程设计寻宝游戏 计算机技术基础(c语言)课程设计 寻宝游戏 #include #include #include #include #include #define ESC ...

  9. hdu 6289 寻宝游戏

    寻宝游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Sub ...

  10. 寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 - 物联网小游戏

    寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 作者简介 科科香,程序员 方向:IoT,方案集成,喜好各种新鲜东东 转载请注明出处 iBeacon简介 iBeacon(下面简称Beaco ...

最新文章

  1. codeforces1486 F. Pairs of Paths(倍增+树上数数)
  2. 【博士招生】卢森堡大学​SnT(CVI²)研究小组,DeepFake 检测领域
  3. HTML的基本知识(七)——表单的基本知识及案例
  4. 全国草地资源类型分布数据/植被类型分布数据/土地利用类型分布数据
  5. IntelliJ Idea 主题(黑色)+代码高亮显示
  6. c语言编写简单实用的小程序,C语言编写一个小程序
  7. GATK / 体细胞短变异检测工具Mutect2的使用
  8. VisibilityAwareImageButton.setVisibility can only be called from within the same library group (grou
  9. 运算放大器节点电压方程_区分运算放大器和电压比较器
  10. Android修改浏览器书签和主页
  11. 微信朋友圈图片处理策略
  12. MIT6.824 2022 Fault-tolerant Key/Value Service
  13. 玩转 Windows 10 中的 Linux 子系统
  14. 字节跳动40W大数据开发岗,面试也不过如此
  15. 全球及中国等离子电视行业市场销售量调研及未来发展展望报告2022-2027年
  16. Mac 更新系统后无法使用git
  17. CANopen DS402 驱动电机运动控制模式
  18. 聚焦场景化应用 华为要做数字化转型的“赶路人”
  19. RT-Thread应用实战-TI温湿度HDC1000软件包设计与制作
  20. [Geek Challenge 2022]Web部分 writeup by q1jun

热门文章

  1. piece table 的C语言简单实现
  2. cocos2D转U3D的一些分享
  3. 儿童吹泡泡水简单配方_小孩吹泡泡的 泡泡水,有谁知道详细的配方?
  4. 基于Springboot外卖系统01:技术构成+功能模块介绍
  5. python编程自学网-python自学网
  6. thermal系列(4)-Thermal Core框架
  7. NR SRB and message transfer
  8. html 磁贴自动布局,也来“玩”MetroUI之磁贴(一)_html/css_WEB-ITnose
  9. emacs python_将Emacs打造成强大的Python代码编辑工具
  10. 《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)