题目

P3320 [SDOI2015]寻宝游戏

做法

很巧妙的一种思路,懂了之后觉得大水题

首先要知道:在一棵树上标记一些点,然后从任意一点出发,遍历所有的的最小路径为\(dfs\)序从小到大遍历

那就把点丢到\(set\)里面,然后找\(dfs\)的前驱与后继计算路径就好了

其实也有点虚树的思想,只管标记的这几个点

My complete code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<ctime>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
typedef long long LL;
const LL maxn=1e5+9;
inline LL Read(){
LL x(0),f(1);char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
struct node{
LL to,next,d;
}dis[maxn<<1];
LL n,T,num,ans,tot;
LL head[maxn],dfn[maxn],pos[maxn],inc[maxn][25],d[maxn],dep[maxn],visit[maxn];
inline void Add(LL u,LL v,LL d){
dis[++num]=(node){v,head[u],d},head[u]=num;
}
void Dfs(LL u){
dfn[u]=++tot,pos[tot]=u;
for(LL i=1;i<=21;++i)
inc[u][i]=inc[inc[u][i-1]][i-1];
for(LL i=head[u];i;i=dis[i].next){
LL v(dis[i].to);
if(v==inc[u][0])
continue;
d[v]=d[u]+dis[i].d,inc[v][0]=u,dep[v]=dep[u]+1;
Dfs(v);
}
}
inline LL Lca(LL x,LL y){
if(dep[x]<dep[y])swap(x,y);
for(LL i=20;i>=0;--i)
if(dep[inc[x][i]]>=dep[y])
x=inc[x][i];
if(x==y)return x;
for(LL i=20;i>=0;--i)
if(inc[x][i]!=inc[y][i])
x=inc[x][i],y=inc[y][i];
return inc[x][0];
}
set<LL> Set;
set<LL> :: iterator it,pre,next;
inline void Query(LL x){
it=Set.find(dfn[x]);
if(it==Set.begin()){
pre=Set.end(),--pre;
}else{
pre=it,--pre;
}
next=it,++next;
if(next==Set.end())
next=Set.begin();
it=Set.find(dfn[x]);
}
inline LL Change(){
return 2*d[pos[*it]]+d[pos[*next]]+d[pos[*pre]]-2*d[Lca(pos[*pre],pos[*it])]-2*d[Lca(pos[*next],pos[*it])];
}
inline LL Split(){
return d[pos[*pre]]+d[pos[*next]]-2*d[Lca(pos[*pre],pos[*next])];
}
int main(){
n=Read(),T=Read();
for(LL i=1;i<n;++i){
LL u(Read()),v(Read()),d(Read());
Add(u,v,d),Add(v,u,d);
}
Dfs(1);
while(T--){
LL now(Read());
if(visit[now]){
Query(now),
ans-=Change(),ans+=Split(),
Set.erase(dfn[now]);
}else{
Set.insert(dfn[now]),
Query(now),
ans-=Split(),ans+=Change();
}
visit[now]^=1;
printf("%lld\n",ans);
}
return 0;
}/*
*/

P3320 [SDOI2015]寻宝游戏的更多相关文章

  1. P3320 [SDOI2015]寻宝游戏 解题报告

    P3320 [SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有\(N\)个村庄和\(N-1\)条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以 ...

  2. Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】

    期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目 ...

  3. [洛谷P3320] SDOI2015 寻宝游戏

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

  4. [bzoj3991] [洛谷P3320] [SDOI2015] 寻宝游戏

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

  5. 洛谷 P3320 [SDOI2015]寻宝游戏

    因为寻宝路径是一个环,所以寻宝花费的最小时间与起点无关.宝应当按照所有宝藏所在位置的 dfs 序进行才能够使得花费的时间最短.设 \(dist_i\) 表示 \(i\) 到树根的最短距离,那么树上任意 ...

  6. luogu P3320 [SDOI2015]寻宝游戏

    大意:给定树, 要求维护一个集合, 支持增删点, 询问从集合中任取一点作为起点, 遍历完其他点后原路返回的最短长度. 集合中的点按$dfs$序排列后, 最短距离就为$dis(s_1,s_2)+...+ ...

  7. [BZOJ3991][SDOI2015]寻宝游戏

    [BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...

  8. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  9. 【LG3320】[SDOI2015]寻宝游戏

    [LG3320][SDOI2015]寻宝游戏 题面 洛谷 题解 不需要建虚树的虚树2333... 贪心地想一下,起始节点肯定是在关键点上,访问顺序就是\(dfs\)序. 那么对于每次询问, \[ An ...

随机推荐

  1. Eclipse 常用快捷键清单

    罗列了一些常用的快捷键(显红为很实用的快捷键) Ctrl+Shift+L:快速打开所有快捷键列表 一.文件 F2 :快速打开信息提示.重命名F3 :打开声明(同Ctrl+左鼠)F4 :打开类型层次结构 ...

  2. Delphi 与 C/C++ 数据类型对照表(最新的tokyo)

    更新,下面这table为最新的tokyo基本数据类型与C++的对照关系: Delphi to C++ types mapping   Go Up to Support for Delphi Data ...

  3. php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法

    1.认识  __set  (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...

  4. GetTickCount()函数的陷阱!

    开发中经经常使用GetTickCount()函数来进行间隔时间的推断.如推断某一段代码运行花了多少时间等,使用比較方便. 可是仅仅针对寻常的一些測试.近期开发一个服务程序时,也在代码中用GetTick ...

  5. spring boot 集成mybatis报错

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of ...

  6. nginx proxy_pass 里的”/”

    见配置,摘自nginx.conf 里的server 段: server { listen 80; server_name abc.163.com ; location / { proxy_pass h ...

  7. div+css 画三角形

            <style type="text/css"> .rightdirection { width:0;height:0; line-height:0; b ...

  8. Android BroadcastReceiver介绍 (转)

    原文地址:http://www.cnblogs.com/trinea/archive/2012/11/09/2763182.html 本文主要介绍BroadcastReceiver的概念.使用.生命周 ...

  9. 工具类之Condition

    再次看到Condition,第一感觉还是觉得它和Mutex的功能是一样的,没必要存在.心里这么想,其实自己也知道怎么可能多余呢?老老实实的再分析一下代码,这次一定要把理解出来的内容记下来!都怪平时写代 ...

  10. php != 和 !== 的区别

    == and != do not take into account the data type of the variables you compare. So these would all re ...