SDOI2015寻宝游戏

好像是一道虚树入门题?

虚树???不会不会我弱死了。。

Solution:

关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径。

基于这个思想,我们思考怎样走出来的会是重复最少的呢???

不妨想一想dfs,我们dfs时就是保证了每个点只遍历一次,每条边只遍历了两次,这已经是最优的情况了!!

所以,对于这些关键点,把它们按照dfs序遍历,可以发现路径就是最小的。

对于修改,我们相当于只要维护了关键点dfs序,就只要对应的在序列上插入、删除就好了,用set即可。

说实话,本人运用set等STL的能力极差,所以每每遇到这种需要set等的题,就会。。。enenen

Code↓:

#include<set>
#include<cmath>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define IL inline
#define LL long long
#define DB double
using namespace std;IL int gi() {char ch=getchar(); RG int x=0,q=0;while(ch<'0'||ch>'9') q=ch=='-'?1:q,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return q?-x:x;
}const int N=1e5+10;set<int> seq;
set<int>::iterator IT,pr,sf;LL ans,dis[N];
int n,m,Time,tot,head[N],mp[N],dep[N],dfn[N],dot[N],f[N][21];struct EDGE{int next,to,ver;}e[N<<1];
IL void make(int a,int b,int c) {e[++tot]=(EDGE){head[a],b,c},head[a]=tot;e[++tot]=(EDGE){head[b],a,c},head[b]=tot;
}void dfs(int x,int fx) {RG int i,y;dfn[x]=++Time,mp[Time]=x;for (i=head[x],dep[x]=dep[fx]+1;i;i=e[i].next)if ((y=e[i].to)!=fx) f[y][0]=x,dis[y]=dis[x]+e[i].ver,dfs(y,x);
}IL void getf() {RG int i,j;for (i=1;i<=18;++i)for (j=1;j<=n;++j)f[j][i]=f[f[j][i-1]][i-1];
}IL void Find(int x) {IT=seq.lower_bound(dfn[x]);if (IT==seq.begin()) pr=seq.end(),pr--;else pr=IT,pr--;sf=IT,sf++;if (sf==seq.end()) sf=seq.begin();
}IL int Lca(int x,int y) {RG int i;if (dep[x]<dep[y]) swap(x,y);for (i=18;i>=0;--i)if (dep[f[x][i]]>=dep[y]) x=f[x][i];if (x==y) return x;for (i=18;i>=0;--i)if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];return f[x][0];
}IL LL Path(int x,int y) {return dis[x]+dis[y]-2*dis[Lca(x,y)];}int main ()
{RG int i,x,y,z,pre=0,suf=0;n=gi(),m=gi();for (i=1;i<n;++i) x=gi(),y=gi(),z=gi(),make(x,y,z);for (i=1,dfs(1,0),getf();i<=m;++i) {dot[x=gi()]^=1;if (dot[x]) {seq.insert(dfn[x]),Find(x);suf=mp[*sf],pre=mp[*pr];ans+=Path(pre,x)+Path(x,suf)-Path(pre,suf);}else {Find(x),seq.erase(dfn[x]);suf=mp[*sf],pre=mp[*pr];ans+=Path(pre,suf)-Path(pre,x)-Path(x,suf);}printf("%lld\n",ans);}return 0;
}

The End

转载于:https://www.cnblogs.com/Bhllx/p/10616998.html

SDOI2015寻宝游戏 dfs序+set相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)

    未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 448  Solved: 150 Descriptio ...

  8. BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)

    Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...

  9. bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)

    3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...

最新文章

  1. linux df命令参数详解
  2. cocos2d-x游戏开发系列教程-坦克大战游戏之坦克的显示
  3. python网络编程库_Python网络编程——协程
  4. 操作系统 VS 编程语言 UNIX VS C语言
  5. 禁止php 报错怎么做,php – 禁用Laravel错误处理程序
  6. Codeforces 994A. Fingerprints
  7. macos设置环境变量path详解
  8. 如何有效管理远程开发团队
  9. 计算机电缆 国家标准,电线电缆常用国家标准
  10. CAN、485隔离电路分享
  11. 导出word文档生成docx格式,包含freemarker遍历多张图片
  12. C#有关字符串和路径的拼接
  13. Spark 和 Python.sklearn:使用随机森林计算 feature_importance 特征重要性
  14. 容联云实现手机验证码
  15. 2020年精彩文章回顾
  16. 线程wait、join用法
  17. Linux如何修改SSH登录密码
  18. 做好软件测试需要具备的思维方式
  19. 大陆居民在香港银行里怎么开帐户?
  20. 关于地质灾害风险性评价

热门文章

  1. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...
  2. 全国青少年软件编程python等级考试-全国青少年软件编程等级考试:Python一级考试大纲...
  3. python的jupyter的使用教程-Jupyter notebook快速入门教程
  4. python做小程序-【实战案例】利用Python做出趣味版防沉迷小程序
  5. python考证书-计算机二级 Python 怎么考?考什么?
  6. python基础知识点整理-Python知识点整理(day1)
  7. python turtle画熊-基于turtle的Python作画
  8. 自学python推荐书籍2019-入门必看 | 大佬们推荐的Python书单汇总
  9. python编程实例视屏-python 下载抖音视频示例源码
  10. python平均工资-2020 10大薪资最高的IT编程语言排名