传送门

这题最关键的一点是要想清楚这个路径长度是咋算的。
要注意到他是走到所有关键点去取宝藏然后回来。我们假想这些关键点构成一棵虚树,那么这就相当于是虚树上的一个dfsdfsdfs。
当关键点确定的时候,其实最短路径长就确定了,也就是在虚树上从一个点开始dfs直到到回到这个节点所经过的路径长之和。起点其实无所谓,不选虚树外面的点就行。

如果我们把虚树上的点按照dfs序从小到大排为p1,p2,⋯,pnp_1,p_2,\cdots,p_np1​,p2​,⋯,pn​,那么这时候询问的答案即为:
ans=∑i=1n−1dis(pi,pi+1)+dis(pn,p1)ans=\sum_{i=1}^{n-1} {dis(p_i,p_{i+1})}+dis(p_n,p_1)ans=i=1∑n−1​dis(pi​,pi+1​)+dis(pn​,p1​)
算是计算树上路径和的一种套路吧。
把dfsdfsdfs序从小到大排列,可以想象成是一个环,要求支持在这个环上加点,删点,求权值和。
发现这个东西用setsetset维护就行了。每次找到前驱后继把权值改一改即可。要注意一下插入的是dfsdfsdfs序。

#include<bits/stdc++.h>
#define cs const
#define re register
#define ll long long
cs int N=1e5+10,Log=17;
int Head[N],Next[N<<1],V[N<<1],cnt=0;
int dfn[N],t[N],key[N],dep[N],f[N][Log],tot=0;
int n,m,x,y,pos;ll z,W[N<<1],dis[N];
std::set<int> S;
typedef std::set<int>::iterator It;
namespace IO{cs int Rlen=1<<22|1;char buf[Rlen],*p1,*p2;inline char gc(){return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}template<typename T>inline T get(){char ch;T x;while(!isdigit(ch=gc()));x=ch^48;while(isdigit(ch=gc())) x=((x+(x<<2))<<1)+(ch^48);return x;}inline int gi(){return get<int>();}inline ll gl(){return get<ll>();}
}
using namespace IO;
inline void add(int u,int v,ll w){Next[++cnt]=Head[u],V[cnt]=v,W[cnt]=w,Head[u]=cnt;}
inline void dfs(int u,int fa){t[dfn[u]=++tot]=u,f[u][0]=fa,dep[u]=dep[fa]+1;for(int re i=1;i<Log;++i) f[u][i]=f[f[u][i-1]][i-1];for(int re i=Head[u],v=V[i];i;v=V[i=Next[i]])if(v!=fa) dis[v]=dis[u]+W[i],dfs(v,u);
}
inline int lca(int u,int v){if(dep[u]<dep[v]) std::swap(u,v);for(int re i=Log-1;~i;--i) if(dep[f[u][i]]>=dep[v]) u=f[u][i];if(u==v) return u;for(int re i=Log-1;~i;--i) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];return f[u][0];
}
inline ll dist(int u,int v){return dis[u]+dis[v]-2ll*dis[lca(u,v)];}
inline int pre(int u){It p=S.lower_bound(u);if(p==S.begin()) return t[*--S.end()];return t[*--p];
}
inline int nxt(int u){It p=S.lower_bound(u);if(++p==S.end()) return t[*S.begin()];return t[*p];
}
ll ans=0;
int main(){//  freopen("2704.in","r",stdin);n=gi(),m=gi();for(int re i=1;i<n;++i)x=gi(),y=gi(),z=gl(),add(x,y,z),add(y,x,z);dfs(1,0);while(m--){pos=gi();if(!key[pos]){key[pos]^=1,S.insert(dfn[pos]),x=pre(dfn[pos]),y=nxt(dfn[pos]);ans+=dist(x,pos)+dist(y,pos)-dist(x,y);}else{key[pos]^=1,x=pre(dfn[pos]),y=nxt(dfn[pos]);ans-=dist(x,pos)+dist(y,pos)-dist(x,y);S.erase(dfn[pos]);}printf("%lld\n",ans);}
}

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. 《Git in Practice》作者访谈:关于Git的八个问题
  2. 8、D8: Default interface methods are only supported starting with Android N (--min-api 24): void
  3. initMNN: init numpy failed mnn笔记
  4. 初学Python(二)——数组
  5. Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示
  6. keil debug时用断点管理抓取变量变化
  7. Effective Java之谨慎地使用本地方法(五十四)
  8. c语言 行程长度编码,C语言编程题,求大佬帮助,关于数组的。
  9. freebsd mysql utf8_FreeBSD下安装mysql基本步骤
  10. C++ 空间配置器(allocator)
  11. 7005.element-ui组件
  12. 英特尔立 Flag:年末一定彻底解决“芯片门”Bug!
  13. Linux—文件系统
  14. 浅析 Spring 中的事件驱动机制
  15. cf1042d 树状数组逆序对+离散化
  16. 程序算法面试 题目汇总 算法题 推理题 规律题
  17. 第三阶段应用层——1.13 数码相册—梳理与总结
  18. 【金猿产品展】EasyTwin——国产自研数字孪生融合渲染引擎
  19. Jenkins系列之——第五章 Jenkins编译一个Spring Boot项目并通过SSH推送到远程
  20. 黑马python培训_要一张纯黑的图片。纯黑的。

热门文章

  1. BTA12A-ASEMI的12A双向可控硅IGBT管
  2. 浏览器网络异常导致JS文件请求失败的问题及处理
  3. Android8.0通知适配
  4. 关于阿里云主机数据丢失问题,是常态还是个例?如何保障数据安全?...
  5. java中的Character和char的区别
  6. 怎样打开t6系统服务器,t6客户端如何连接服务器
  7. 推荐一款免费的pdf怎么转换成word工具
  8. CATIA常用的26个小技巧
  9. 如何在计算机自动开机时选择用户,电脑如何设置自动开机
  10. java商城加入购物车接口实现_商城系统购物车功能分析实现