【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set

题目描述

给出一棵树,初始每个点都是非必经的。多次改变某个点的必经状态,并询问从任意一个点出发,经过所有必经的点并回到该点的最小路程。

输入

第一行,两个整数N、M,其中M为宝物的变动次数。

接下来的N-1行,每行三个整数x、y、z,表示村庄x、y之间有一条长度为z的道路。
接下来的M行,每行一个整数t,表示一个宝物变动的操作。若该操作前村庄t内没有宝物,则操作后村庄内有宝物;若该操作前村庄t内有宝物,则操作后村庄内没有宝物。

输出

M行,每行一个整数,其中第i行的整数表示第i次操作之后玩家找到所有宝物需要行走的最短路程。若只有一个村庄内有宝物,或者所有村庄内都没有宝物,则输出0。

样例输入

4 5
1 2 30
2 3 50
2 4 60
2
3
4
2
1

样例输出

0
100
220
220
280


题解

树链的并+STL-set

考虑指定某个点为根,如果从根节点出发的话,答案显然是所有必经点到根节点的树链的并的长度*2。

我们维护这个树链的并:把所有点按照dfs序排序,每个点到根的距离减去排序后相邻两点LCA到根的距离就是树链的并的长度。本题由于需要支持插入和删除,因此可以使用STL-set。

但是这并不是最优解。考虑重复经过了哪一段:所有相邻两点LCA中深度最小的到根节点的距离。也即按dfs序排序后第一个点和最后一个点的LCA到根节点的距离。因此再使用set统计一下答案即可。

时间复杂度 $O(n\log n)$

#include <set>
#include <cstdio>
#define N 100010
using namespace std;
typedef long long ll;
set<int> s;
int head[N] , to[N << 1] , len[N << 1] , next[N << 1] , cnt , fa[N][20] , deep[N] , log[N] , pos[N] , ref[N] , tot , vis[N];
ll dis[N];
inline void add(int x , int y , int z)
{to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x)
{int i;pos[x] = ++tot , ref[tot] = x;for(i = 1 ; (1 << i) <= deep[x] ; i ++ ) fa[x][i] = fa[fa[x][i - 1]][i - 1];for(i = head[x] ; i ; i = next[i])if(to[i] != fa[x][0])fa[to[i]][0] = x , deep[to[i]] = deep[x] + 1 , dis[to[i]] = dis[x] + len[i] , dfs(to[i]);
}
inline int lca(int x , int y)
{int i;if(deep[x] < deep[y]) swap(x , y);for(i = log[deep[x] - deep[y]] ; ~i ; i -- )if((1 << i) <= deep[x] - deep[y])x = fa[x][i];if(x == y) return x;for(i = log[deep[x]] ; ~i ; i -- )if((1 << i) <= deep[x] && fa[x][i] != fa[y][i])x = fa[x][i] , y = fa[y][i];return fa[x][0];
}
int main()
{int n , m , i , x , y , z;set<int>::iterator it;ll now = 0;scanf("%d%d" , &n , &m);for(i = 2 ; i <= n ; i ++ ) scanf("%d%d%d" , &x , &y , &z) , add(x , y , z) , add(y , x , z) , log[i] = log[i >> 1] + 1;dfs(1);while(m -- ){scanf("%d" , &x) , y = z = 0;if(!vis[x]){it = s.upper_bound(pos[x]);if(it != s.end()) y = ref[*it];if(it != s.begin()) z = ref[*--it];if(y) now -= dis[lca(x , y)];if(z) now -= dis[lca(x , z)];if(y && z) now += dis[lca(y , z)];now += dis[x] , vis[x] = 1 , s.insert(pos[x]);}else{now -= dis[x] , vis[x] = 0 , s.erase(pos[x]);it = s.upper_bound(pos[x]);if(it != s.end()) y = ref[*it];if(it != s.begin()) z = ref[*--it];if(y) now += dis[lca(x , y)];if(z) now += dis[lca(x , z)];if(y && z) now -= dis[lca(y , z)];}if(s.size() < 2) puts("0");else printf("%lld\n" , (now - dis[lca(ref[*s.begin()] , ref[*--s.end()])]) << 1);}return 0;
}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/8059408.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 引入json地图_VUE中通过Echarts引入地图

渲染的方法如下 记得引入echartsimport echarts from echarts-----------------------------------init(dalian){this.$nextTick(()>{var myChart this.$echarts.init(document.getElementById(echartMap));echarts.registerMap(dalian, dalian,{});myChart.setOption({ser…

Django---admin

Django内置admin 1.配置路由 urlpatterns [url(r^admin/, admin.site.urls),] 2.定制admin 在admin.py中只需要讲Mode中的某个类注册&#xff0c;即可在Admin中实现增删改查的功能&#xff0c;如&#xff1a; admin.site.register(models.UserInfo) 但是&#xff0c;这种方式比…

vue 父组件获取接口值传到子组件_vue父组件异步获取数据传给子组件的方法

但是现在问题是父组件的数据是异步获取的&#xff0c;而子组件一开始就会渲染&#xff0c;如果此时没有传入数据&#xff0c;而子组件又要用到数据中的length属性时就会报错&#xff1a;怎么办呢&#xff1f;最简单的办法就是让子组件条件渲染&#xff0c;当有数据的时候才渲染…

python爬取数据需要注意的问题

1 爬取https的网站或是接口的时候&#xff0c;如果是不受信用的SSL证书&#xff0c;会报错&#xff0c;需要添加如下代码&#xff0c;如下代码可以保证当前代码块内所有的请求都自动屏蔽ssl证书问题&#xff1a; import ssl # 这个是爬取https的链接需要的&#xff0c;以及下…

pandas 合并所有列_Python学习:Pandas库+练习资料

pandas包含数据结构和数据处理工具的设计使得在Python中进行数据清洗和分析非常快捷。pandas经常是和NumPy,Scipy以及数据可视化工具matplotlib一起使用的。pandas支持大部分NumPy语言风格的数组计算&#xff0c;但最大的不同在于pandas是用于处理表格型或异质型数据的。而NumP…

oracle 取mac地址,java执行命令,得到Mac地址

public static void main(String[] args) {String os System.getProperty("os.name");System.out.println("操作系统:"os);String address "";if (os ! null && os.startsWith("Windows")) {try {String command "cmd…

solidity 十六进制字符串转十六进制bytes

pragma solidity ^0.4.16;contract Metadata {// 十六进制字符串转换成bytesfunction hexStr2bytes(string data)returns (bytes){uint _ascii_0 48;uint _ascii_A 65;uint _ascii_a 97;bytes memory a bytes(data);uint[] memory b new uint[](a.length);for (uint i 0;…

spring配置主库从库_Spring主从数据库的配置和动态数据源切换原理

原文&#xff1a;https://www.liaoxuefeng.com/article/00151054582348974482c20f7d8431ead5bc32b30354705000在大型应用程序中&#xff0c;配置主从数据库并使用读写分离是常见的设计模式。在Spring应用程序中&#xff0c;要实现读写分离&#xff0c;最好不要对现有代码进行改…

oracle rac实例切换,RAC+单实例DG的切换

RAC单实例DG的切换RAC单实例DG的搭建过程之前切换不成功&#xff0c;和参数设置有关。注意的参数是sid* 之类的&#xff0c;刚搭建好的环境racdbdg是单实例的&#xff0c;是备库&#xff0c;rac节点是主库。搭建完毕&#xff0c;切换了一次&#xff0c;刚好主库是单实例的racdb…

tablueau地图标记圆形_R语言在线地图神器:Leaflet for R包(三) 符号标记

如果还是直接写&#xff0c;会出现错误提示&#xff0c;说找不到经纬度的列像这种情况&#xff0c;就需要进行显式申明了&#xff1a;(顺便换个背景底图)leaflet(dh)%>%addProviderTiles("Esri.WorldStreetMap")%>%setView(116.4,39.9,zoom10)%>%addMarkers…

zabbix自动发现主机并加入组绑定模板

在被监控主机多的情况下&#xff0c;怎样将这些主机加入zabbix server进行监控呢&#xff1f;下面将介绍下zabbix自动发现功能 1、创建自动发现规则 创建“规则名称&#xff0c;配置ip范围及检查方式”&#xff0c;点击“增加”&#xff0c;完成自动发现规则的创建 2、加入组和…

oracle ora 08103,ORA-08103: 对象不再存在

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[2017-05-17 17:13:22] Function Called in lngGetDataTableWithParametersselect distinct to_char (b.chargeactive_dat, yyyymmdd) as orderdate,to_char(a.recipeno2_int) as recipeno2_chr, b.orderexectype_int as ordertype…

kotlin 用协程做网络请求_中国电信营业厅: 感受 Kotlin 的 quot;加速度quot;

"我们手上是一个很成熟的项目&#xff0c;所以毫无疑问需要保留 Java 代码&#xff0c;目前只会在新开发的页面中使用 Kotlin&#xff0c;并已经感受到了它带来的便利。随着功能的迭代&#xff0c;我们相信更多的功能会转而使用 Kotlin。"—— 付迎鑫&#xff0c;电信…

拖动验证码插件

拖动验证码插件 效果图&#xff1a; 在验证前&#xff0c;提交弹出验证失败&#xff0c;验证后弹出验证成功。 文件结构&#xff1a; css&#xff1a; #drag{ position: relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center; …

matlab padarray函数零,matlab padarray函数

1padarray功能&#xff1a;填充图像或填充数组。用法&#xff1a;B padarray(A,padsize,padval,direction)A为输入图像&#xff0c;B为填充后的图像&#xff0c;padsize给出了给出了填充的行数和列数&#xff0c;通常用[r c]来表示。padval表示填充方法。它的具体值和描述如下…

如何将已有图片做成透明水印_如何用Photoshop在图片上添加透明水印?

我们经常会在网上看到一些漂亮的图片上有添加各种水印&#xff0c;添加水印可以让图片有一个标记&#xff0c;也可以防止别人盗用你的成果。那么图片上的这些水印是怎么添加的呢&#xff1f;今天&#xff0c;小编就给大家介绍用Photoshop软件来制作图片的透明水印的教程&#x…

[知了堂学习笔记]_网络基础知识_1.OSI参考模型(网络七层协议)

OSI参考模型是国际标准化组织ISO制定的模型&#xff0c;把计算机与计算机之间的通信分成七个互相连接的协议层&#xff0c;如图&#xff1a; 1.1各层功能 1、物理层 最底层是物理层&#xff0c;这一次负责传送比特流&#xff0c;它从第二层数据接收数据帧&#xff0c;并将帧的结…

微信小程序js数组初始化_微信小程序 数组(增,删,改,查)等操作实例详解...

微信小程序 数组(增&#xff0c;删&#xff0c;改&#xff0c;查)等操作最近在做一个小程序的demo。由于不向后台请求数据&#xff0c;所以就涉及到对本地数据的操作&#xff0c;也遇到了一些坑&#xff0c;本文就以数组的增删改查为例&#xff0c;给新手分享一些经验。首先这是…

Linux版本配置环境变量,如何linux环境下配置环境变量过程图解

jdk下载地址&#xff1a;在linux环境下的root同级目录下配置software目录将下载好的jdk上传到software文件夹里面(我使用的操作软件是)到software这个目录下.输入命令:cd /software输入命令:ll就可以看到我们的jdk包解压文件解压命令 tar xzvf jdk-8u111-linux-x64.tar.gz解压之…

linux的mysql本地yum安装_linux下使用yum安装mysql

mysql yum repository提供linux平台上面的MySQL server, client和其它组件的rpm包。它支持以下平台&#xff1a;基于EL5-, EL6-, 和 EL7-的平台&#xff0c;比如对应版本的ed Hat Enterprise Linux, Oracle Linux, CentOSFedora 22, 23, 24步骤&#xff1a;一、添加mysql yum r…