之前貌似在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. 给img添加类名可以动态切换图片

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  2. position-relative 的问题

    对100%宽度的元素0001添加position-relative属性,如果再给left/right属性,可能会导致0001元素超出其父盒子的范围.如果盒子0001的父级元素是body,可能会出现滚动 ...

  3. redis 存储session实现session共享

    nginx 作为代理 tomcat集群 redis存储共享session nginx采用轮询方式将动态请求反向代理给tomcat,tomcat通过加载相应jar包方式实现获得redis中共享的sess ...

  4. Y86模拟器安装

    Y86模拟器安装 这周需要学习Y86下的指令集开发,Y86和x86可以说是孪生兄弟,但是还是存在着一些小的差别.接下来介绍如何进行linux-debian平台下的Y86模拟器安装. 虚拟机VMware ...

  5. Angular JS笔记

    1.引导程序 使用ng-app开始引导一个程序:标记了AngularJS应用的作用域 <!doctype html> <html lang="en" ng-app ...

  6. Storm TimeCacheMap RotatingMap源码分析

    TimeCacheMap是Twitter Storm里面一个类, Storm使用它来保存那些最近活跃的对象,并且可以自动删除那些已经过期的对象. 不过在storm0.8之后TimeCacheMap被弃 ...

  7. How to retrieve instance parameters from an uninstantiated (uninserted) family

    The trick to be able to read the default values for instance parameters is to get to the FamilyManag ...

  8. XIII Open Cup named after E.V. Pankratiev. GP of America

    A. Explosions 注意到将炸弹按坐标排序后,每个炸弹直接引爆和间接引爆的都是连续的一段区间,因此只需要求出每个炸弹能间接炸到的最左和最右的炸弹即可. 建立图论模型,炸弹$i$向炸弹$j$连单 ...

  9. [转]使用EasyRsa3为OpenVPN生成密码

    1. 下载Easy RSA3 下载完并解压后,拷贝一份到/etc/openvpn和/home/client下 #.3版本需要独立下载个easy-rsa,该包用来制作ca证书,服务端证书,客户端证书 w ...

  10. Leetcode Integer to Roman

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...