之前貌似在hdu还是poj上写过这道题。

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #include<set>
 #define maxn 100010
 #define INF 0x7fffffff
 using namespace std;
 struct node{
     int to,cost,next;
 }e[maxn*];
 int n,m,u,v,c,logn,tot,time,x;
 ],head[maxn],dep[maxn],id[maxn],pos[maxn];
 ];
 bool flag[maxn];
 long long ans,t;
 set<int> st;

 inline void insert(int u, int v, int c){
     e[++tot].to=v;
     e[tot].cost=c;
     e[tot].next=head[u];
     head[u]=tot;
 }

 inline void dfs(int u, int f, int d, int c){
     pos[u]=++time; id[time]=u;
     dep[u]=d;
     fa[u][]=f; dis[u][]=c;
     ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
     ; i<=logn; i++) dis[u][i]=dis[u][i-]+dis[fa[u][i-]][i-];
     ; i=e[i].next)
         ,e[i].cost);
 }

 inline long long lca(int u, int v){
     ;
     if (dep[u]>dep[v]) swap(u,v);
     while (dep[u]<dep[v]){
         ; i--)
             if (dep[u]<dep[fa[v][i]]){
                 sum+=dis[v][i];
                 v=fa[v][i];
             }
         sum+=dis[v][];
         v=fa[v][];
     }
     if (u==v) return sum;
     ; i--)
         if (fa[u][i]!=fa[v][i]){
             sum+=dis[u][i]+dis[v][i];
             u=fa[u][i]; v=fa[v][i];
         }
     sum+=dis[u][]+dis[v][];
     return sum;
 }

 int main(){
     scanf("%d%d", &n, &m);
     logn=; <<logn)<n) logn++;
     tot=-; memset(head,-,sizeof(head));
     ; i<n; i++){
         scanf("%d%d%d", &u, &v, &c);
         insert(u,v,c);
         insert(v,u,c);
     }
     time=;
     dfs(,,,);
     st.insert(-INF); st.insert(INF);
     while (m--){
         scanf("%d", &x);
         if (!flag[x]){
             flag[x]=;
             int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]);
             st.insert(pos[x]);
             if (l !=-INF) ans+=lca(id[l],x);
             if (r != INF) ans+=lca(x,id[r]);
             if (l!=-INF && r!=INF) ans-=lca(id[l],id[r]);
         }
         else{
             flag[x]=;
             st.erase(pos[x]);
             int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]);
             if (l!=-INF) ans-=lca(id[l],x);
             if (r!= INF) ans-=lca(x,id[r]);
             if (l!=-INF && r!=INF) ans+=lca(id[l],id[r]);
         }
         ){
             int l=*++st.lower_bound(-INF), r=*--st.lower_bound(INF);
             t=lca(id[l],id[r]);
         }
         printf("%lld\n", ans+t);
     }
     ;
 }

bzoj3991: [SDOI2015]寻宝游戏--DFS序+LCA+set动态维护的更多相关文章

  1. [BZOJ 3991][SDOI2015]寻宝游戏(dfs序)

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

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

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

  3. CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏

    异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...

  4. BZOJ3991 [SDOI2015]寻宝游戏 【dfs序 + lca + STL】

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

  5. luogu3320 寻宝游戏 (dfs序+倍增lca+set)

    一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用se ...

  6. [bzoj3991][SDOI2015]寻宝游戏_树链的并_倍增lca_平衡树set

    寻宝游戏 bzoj-3991 SDOI-2015 题目大意:题目链接. 注释:略. 想法:我们发现如果给定了一些点有宝物的话那么答案就是树链的并. 树链的并的求法就是把所有点按照$dfs$序排序然后相 ...

  7. bzoj3991 [Sdoi2015]寻宝游戏 set动态维护虚树+树链求并

    题目大意:支持多次操作,增加或删除一个关键点 动态维护虚树边权和*2 分析:可以用树链求并的方法,最后减去虚树的根到1距离 注意到树链求并是所有点到根距离-所有dfn序相邻两点的LCA到根距离 找df ...

  8. bzoj3991 [SDOI2015]寻宝游戏 树链的并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3991 题解 貌似这个东西叫做树链的并,以前貌似写过一个类似的用来动态维护虚树. 大概就是最终的 ...

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

    在考试代码的基础上稍微改改就a了……当时为什么不稍微多想想…… 插入/删除一个新节点时就把其dfn插入set/从set中删除. 当前的答案就是dfn上相邻的两两节点的距离和,再加上首尾节点的距离. 比 ...

随机推荐

  1. 【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中

    问题: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示:  问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  2. AndroidTips:解决Dialog全屏显示以及Dialog显示自动弹出输入法

    继承实现一个dialog,并在onCreate里面做处理. @Override  protected void onCreate(Bundle savedInstanceState) {      s ...

  3. hdu3496 二维01背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...

  4. SQL SERVER获取数据库中所有表名 XTYPE类型

    SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名,  (case whe ...

  5. WPF ComboBox Binding

    public ConnectionViewModel { private readonly CollectionView _phonebookEntries; private string _phon ...

  6. 来自于2016.2.23的flag

    正是中午,百废待兴,写点什么调节一会儿心情吧.正巧有许多的想法. 机房来了许多小朋友,多么像一年之前的我啊,想写题,心又纷乱,但不同的是他们比我强太多了. 停课是什么感觉?停课在机房与寒暑假.双休日在 ...

  7. html5代码,获取地理位置

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta htt ...

  8. [题解+总结]动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  9. 【HDU】1517 A Multiplication Game

    http://acm.hdu.edu.cn/showproblem.php?pid=1517 题意:每次乘上2~9..p>=n时赢.. #include <cstdio> #incl ...

  10. 求1+2+……+n(位运算)

    求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 我发现网上的做法都很神,各种理由编译的巧妙办法,就能间接 ...