传送门


可以发现从哪里开始的最优答案都是一样的。我们只需要用一种比较好维护的方法维护答案就好了。

我们考虑用$dfs$序加上$set$维护链并。先预处理$dfs$序,将当前有宝藏的点丢入$set$中,按照$dfs$序排序,那么答案就是相邻两个点之间的路径的和加上第一个点到最后一个点的路径的和。动态维护这个答案九星了。

#include<bits/stdc++.h>
#define int long long
//This code is written by Itst
using namespace std;

inline int read(){
    ;
    ;
    char c = getchar();
    while(c != EOF && !isdigit(c)){
        if(c == '-')
            f = ;
        c = getchar();
    }
    while(c != EOF && isdigit(c)){
        a = (a << ) + (a << ) + (c ^ ');
        c = getchar();
    }
    return f ? -a : a;
}

;
struct Edge{
    int end , upEd , w;
}Ed[MAXN << ];
] , dep[MAXN] , ans , N , M , ts , cntEd;
struct cmp{
    bool operator ()(int a , int b){
        return dfn[a] < dfn[b];
    }
};
set < int , cmp > s;
set < int , cmp > :: iterator it , it1 , it2;

inline void addEd(int a , int b , int c){
    Ed[++cntEd].end = b;
    Ed[cntEd].upEd = head[a];
    Ed[cntEd].w = c;
    head[a] = cntEd;
}

void dfs(int now , int fa){
    jump[now][] = fa;
    dep[now] = dep[fa] + ;
    dfn[now] = ++ts;
     ; jump[now][i - ] ; ++i)
        jump[now][i] = jump[jump[now][i - ]][i - ];
    for(int i = head[now] ; i ; i = Ed[i].upEd)
        if(Ed[i].end != fa){
            len[Ed[i].end] = len[now] + Ed[i].w;
            dfs(Ed[i].end , now);
        }
}

inline int jumpToLCA(int x , int y){
    if(dep[x] < dep[y])
        swap(x , y);
     ; i >=  ; --i)
         << i) >= dep[y])
            x = jump[x][i];
    if(x == y)
        return x;
     ; i >=  ; --i)
        if(jump[x][i] != jump[y][i]){
            x = jump[x][i];
            y = jump[y][i];
        }
    ];
}

inline int calcLen(int x , int y){
    );
}

inline void insert(int x){
    it = s.lower_bound(x);
    if(it == s.end() || *it != x){
        if(!s.empty()){
            int p , q;
            if(it == s.end())
                q = *s.begin();
            else
                q = *it;
            if(it == s.begin())
                p = *--s.end();
            else
                p = *--it;
            ans = ans - calcLen(p , q) + calcLen(p , x) + calcLen(x , q);
        }
        s.insert(x);
    }
    else{
        int p , q;
        it1 = it;
        ++it1;
        if(it1 == s.end())
            q = *s.begin();
        else
            q = *it1;
        it1 = it;
        if(it1 == s.begin())
            p = *--s.end();
        else
            p = *--it1;
        ans = ans + calcLen(p , q) - calcLen(p , x) - calcLen(x , q);
        s.erase(it);
    }
}

signed main(){
#ifndef ONLINE_JUDGE
    freopen("3320.in" , "r" , stdin);
    //freopen("3320.out" , "w" , stdout);
#endif
    N = read();
    M = read();
     ; i < N ; ++i){
        int a = read() , b = read() , c = read();
        addEd(a , b , c);
        addEd(b , a , c);
    }
    dfs( , );
     ; i <= M ; ++i){
        insert(read());
        printf("%lld\n" , ans);
    }
    ;
}

Luogu3320 SDOI2015 寻宝游戏 链并的更多相关文章

  1. 【BZOJ3991】[SDOI2015]寻宝游戏 树链的并+set

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

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

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

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

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

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

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

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

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

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

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

  7. 3991: [SDOI2015]寻宝游戏

    3991: [SDOI2015]寻宝游戏 https://www.lydsy.com/JudgeOnline/problem.php?id=3991 分析: 虚树+set. 要求树上许多点之间的路径的 ...

  8. P3320 [SDOI2015]寻宝游戏

    题目 P3320 [SDOI2015]寻宝游戏 做法 很巧妙的一种思路,懂了之后觉得大水题 首先要知道:在一棵树上标记一些点,然后从任意一点出发,遍历所有的的最小路径为\(dfs\)序从小到大遍历 那 ...

  9. [SDOI2015]寻宝游戏(LCA,set)

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

随机推荐

  1. CSS水平居中的三种方法

    CSS中经常会用到元素居中,那么今天我为大家分享几种水平居中的方法,下面代码都可以达到同样的居中效果,来不及解释了,快上马(码): 一.margin : 0 auto; <head> &l ...

  2. SAP 官网中文帮助文件&BP中文资料汇总

    系统 描述 版本 连接 SAP ME  制造执行 SAP Manufacturing Execution (SAP ME) 15.0 点击我 SAP ECC EHP6 财务部分 SAP ERP 6.0 ...

  3. 华为交换机MSTP+VRRP配置实例说明文档

    华为交换机MSTP+VRRP配置实例说明文档 拓扑图 IP地址规划表 设备名称 设备接口 对端设备 对端接口 VLAN VLAN /接口地址 备注 SW0 GE0/0/23 SW2 GE0/0/23 ...

  4. Web API的参数、多版本和Filter

    一.关于API的参数a) Web API在WebApiConfig.cs中配置了路由模板,默认为"api/{controller}/{id}",这与MVC路由模板的区别在于没有{a ...

  5. Kotlin入门(15)独门秘笈之特殊类

    上一篇文章介绍了Kotlin的几种开放性修饰符,以及如何从基类派生出子类,其中提到了被abstract修饰的抽象类.除了与Java共有的抽象类,Kotlin还新增了好几种特殊类,这些特殊类分别适应不同 ...

  6. C# RSA 加密

    class Sign_verifySign { #region prepare string to sign. //example format: a=123&b=xxx&c (wit ...

  7. Postgresql_根据执行计划优化SQL

    执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...

  8. json数据 二级联动

    <head> <link href="static/bootstrap-3.3.5-dist/css/bootstrap.css" rel="style ...

  9. pycharm的安装和使用小技巧

    一,pycharm 1,在官网下载pycharm,版本选5.0,一定要下载专业版. 2,注册方法:注册时选择 license server,填入:http://idea.qinxi1992.cn,然后 ...

  10. vue+webpack安装sass过程中遇到权限不够,直接删除node_modus文件夹重新安装,node_modus先取得管理员权限才能删

    vue vue-style-loader !css-loader错误 最近在学习vue框架,使用webpack打包vue项目,在执行npm run start的时候 出现如下错误: This depe ...