代码

(树链剖分)

#include<cstdio>
#include<set>
using namespace std;
typedef long long LL; const int N = 1e5;
int top[N + 5] , dfn[N + 5] , rev[N + 5] , fa[N + 5] , size[N + 5] , son[N + 5] , dep[N + 5];
LL dis[N + 5] , ans , now;
int vis[N + 5] , h[N + 5] , n , m , tot = 1 , cnt;
struct node1{
int to , nxt , w;
}e[(N << 1) + 5];
set<int> list;
set<int>::iterator it; inline int read()
{
char ch = getchar();
int res = 0;
for(; ch < '0' || ch > '9'; ch = getchar());
for(; ch >= '0' && ch <= '9'; ch = getchar()) res = (res << 3) + (res << 1) + ch - '0';
return res;
} inline void add(int x , int y , int z)
{
e[++tot].to = y;
e[tot].w = z;
e[tot].nxt = h[x];
h[x] = tot;
} inline void dfs1(int x , int f , int d)
{
dep[x] = d;
dfn[x] = ++cnt;
rev[cnt] = x;
fa[x] = f;
size[x] = 1;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == f) continue;
dis[v] = dis[x] + 1LL * e[i].w;
dfs1(v , x , d + 1);
size[x] += size[v];
if (size[v] > size[son[x]]) son[x] = v;
}
} inline void dfs2(int x , int f , int t)
{
top[x] = t;
if (son[x] > 0) dfs2(son[x] , x , t);
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == f || v == son[x]) continue;
dfs2(v , x , v);
}
} inline int query(int x , int y)
{
int fx = top[x] , fy = top[y];
while (fx != fy)
{
if (dep[fx] >= dep[fy]) x = fa[fx] , fx = top[x];
else y = fa[fy] , fy = top[y];
}
if (dep[x] <= dep[y]) return x;
return y;
} inline LL ask(int x , int y)
{
return dis[x] + dis[y] - 2 * dis[query(x , y)];
} int main()
{
// freopen("寻宝游戏.in" , "r" , stdin);
n = read() , m = read();
int x , y , z;
for(register int i = 1; i < n; i++)
{
x = read() , y = read() , z = read();
add(x , y , z) , add(y , x , z);
}
dfs1(1 , 0 , 1) , dfs2(1 , 0 , 1);
for(register int i = 1; i <= m; i++)
{
x = read();
x = dfn[x];
if (!vis[rev[x]]) list.insert(x);
y = rev[(it = list.lower_bound(x)) == list.begin() ? *--list.end() : *--it];
z = rev[(it = list.upper_bound(x)) == list.end() ? *list.begin() : *it];
if (vis[rev[x]]) list.erase(x);
x = rev[x];
now = ask(y , x) + ask(x , z) - ask(y , z);
if (!vis[x]) vis[x] = 1 , ans += now;
else vis[x] = 0 , ans -= now;
printf("%lld\n" , ans);
}
}

(倍增)

#include<cstdio>
#include<set>
using namespace std;
typedef long long LL; const int N = 1e5;
int top[N + 5] , dfn[N + 5] , rev[N + 5] , fa[N + 5] , size[N + 5] , son[N + 5] , dep[N + 5];
LL dis[N + 5] , ans , now;
int vis[N + 5] , h[N + 5] , n , m , tot = 1 , cnt , f[N + 5][30];
struct node1{
int to , nxt , w;
}e[(N << 1) + 5];
set<int> list;
set<int>::iterator it; inline int read()
{
char ch = getchar();
int res = 0;
for(; ch < '0' || ch > '9'; ch = getchar());
for(; ch >= '0' && ch <= '9'; ch = getchar()) res = (res << 3) + (res << 1) + ch - '0';
return res;
} inline void add(int x , int y , int z)
{
e[++tot].to = y;
e[tot].w = z;
e[tot].nxt = h[x];
h[x] = tot;
} inline int dfs(int x , int fa)
{
dfn[x] = ++cnt;
rev[cnt] = x;
for(register int i = 1; i <= 25; i++)
if (f[x][i - 1]) f[x][i] = f[f[x][i - 1]][i - 1];
else break;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dis[v] = dis[x] + e[i].w;
dep[v] = dep[x] + 1 , f[v][0] = x , dfs(v , x);
}
} inline int LCA(int u , int v)
{
if (dep[u] < dep[v]) swap(u , v);
register int deep = dep[u] - dep[v];
for(register int i = 0; i <= 25; i++)
if ((1 << i) & deep) u = f[u][i];
if (u == v) return u;
for(register int i = 25; i >= 0; i--)
if (f[u][i] != f[v][i]) u = f[u][i] , v = f[v][i];
return f[u][0];
} inline LL ask(int x , int y)
{
return dis[x] + dis[y] - 2 * dis[LCA(x , y)];
} int main()
{
// freopen("寻宝游戏.in" , "r" , stdin);
n = read() , m = read();
int x , y , z;
for(register int i = 1; i < n; i++)
{
x = read() , y = read() , z = read();
add(x , y , z) , add(y , x , z);
}
dfs(1 , 0);
for(register int i = 1; i <= m; i++)
{
x = read();
x = dfn[x];
if (!vis[rev[x]]) list.insert(x);
y = rev[(it = list.lower_bound(x)) == list.begin() ? *--list.end() : *--it];
z = rev[(it = list.upper_bound(x)) == list.end() ? *list.begin() : *it];
if (vis[rev[x]]) list.erase(x);
x = rev[x];
now = ask(y , x) + ask(x , z) - ask(y , z);
if (!vis[x]) vis[x] = 1 , ans += now;
else vis[x] = 0 , ans -= now;
printf("%lld\n" , ans);
}
}

【SDOI2015】寻宝游戏的更多相关文章

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

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

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

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

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

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

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

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

  5. 3991: [SDOI2015]寻宝游戏

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

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

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

  7. P3320 [SDOI2015]寻宝游戏

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

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

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

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

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

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

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

随机推荐

  1. 图神经网络之预训练大模型结合:ERNIESage在链接预测任务应用

    1.ERNIESage运行实例介绍(1.8x版本) 本项目原链接:https://aistudio.baidu.com/aistudio/projectdetail/5097085?contribut ...

  2. IDEA git配置

    必备:安装Idea \ git配置git坏境:在环境变量中添加git安装包bin目录即可 1.去git官网申请一个账号 https://github.com/ 创建一个新的项目 2.在快速启动栏或者g ...

  3. Day29 派生, 封装 , 多态, 反射

    Day29 派生, 封装 , 多态, 反射 内容概要 派生方法的实践 面向对象之封装 面向对象之多态 面向对象之反射 反射的实践案例 内容详细 1.派生方法的实践 #需求展示 import json ...

  4. Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章

    第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...

  5. 微信小程序实战,基于vue2实现瀑布流

    1.什么是瀑布流呢? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 瀑布流对于图片的展现, ...

  6. 【Hadoop学习】补充:优化、新特性

    一.数据压缩 1.概述 原则:IO密集而不是计算密集的job 压缩算法选择 2.压缩位置选择 通过参数进行配置 3.压缩实例: 数据流的压缩和解压缩 Map输出端采用压缩 Reduce输出端采用压缩 ...

  7. k8s篇-k8s集群架构及组件详解【史上最详细】

    O kubernetes简介 k8s是什么 k8s是一个可移植的.可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化. k8s能做什么 1)服务发现和负载均衡 Kuberne ...

  8. Jvm上如何运行其他语言?JSR223规范最详细讲解

    一 在Java的平台里,其实是可以执行其他的语言的.包括且不仅限于jvm发展出来的语言. 有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着 ...

  9. flutter系列之:如丝般顺滑的SliverAppBar

    目录 简介 SliverAppBar详解 SliverAppBar的使用 总结 简介 对于一个APP来说,肯定会有一个AppBar,这个AppBar一般包含了APP的导航信息等.虽然我们可以用一个固定 ...

  10. Jenkins&&gitlab

    DevOps 强调整个组织的合作以及交付和基础设施变更的自动化 gitlab下载: 下载地址: https://docs.gitlab.com/ee/install/requirements.html ...