[ BZOJ 4668 ] 冷战


\(\\\)

\(Description\)


\(N\)个点,开始没有边相连,进行按顺序给出的\(M\)个操作:

  • \(0\ u\ v\)\(u,v\)两点连一条边
  • \(1\ u\ v\) 查询\(u,v\)两点最早在第几条边连接的时候被连通

每次询问输出一个边的编号,强制在线。

  • \(N,M\in [1,5\times 10^5]\)

\(\\\)

\(Solution\)


在线并查集树上查询\(Lca\)

维护连通性的时候并查集不进行路径压缩,只进行按秩合并。考虑到并查集是树形结构,定义连通块的秩为块内树高\((\)其实定义为块的大小表现也不错\()\)。这样我们得到的是一棵真正的通过并集来连接的并查集树。

这棵树上有什么好的性质?答案是两点到\(Lca\)的路径上的边集,是真正将这两点连接起来的边集。也就是说,对于两点查询的答案,一定是两点到\(Lca\)路径上的最大边编号。

考虑如何求\(Lca\)。因为是在线,所以显然不能建立倍增数组等基于固定的树形态的做法。考虑暴力标记,先将两点跳到同一高度,再共同跳到\(Lca\)处既可,这样也能很方便的处理路径\(max\)的问题。

关于复杂度,其实它是合法的。根据按秩合并的原理,在查询连通块代表元素时复杂度是\(log\)级别的,同理都是跳父节点的过程,所以查询\(Lca\)复杂度也是\(log\)级别的。

\(\\\)

\(Code\)


并查集需要维护:当前节点深度,当前节点父节点编号,到父节点的边权,以及以当前节点为根子树大小。

注意当前节点深度这个部分,在查询\(Lca\)之前我们需要先更新一遍以确保深度是正确的,这个过程可以在查询代表元素的时候同时进行。

#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 500010
#define R register
#define gc getchar
using namespace std;int n,m,ans,cnt;struct UFS{int f[N],g[N],d[N],sz[N];UFS(){for(R int i=1;i<N;++i)f[i]=i,d[i]=sz[i]=1;}int find(int x){if(x==f[x])return x;int ans=find(f[x]); d[x]=d[f[x]]+1; return ans;}inline void merge(int x,int y){int fx=find(x),fy=find(y);if(sz[fx]>sz[fy]) fx^=fy^=fx^=fy;sz[fy]+=sz[fx]; f[fx]=fy; g[fx]=cnt; d[fx]=d[fy]+1;}inline int lca(int x,int y){int ans=0;if(d[x]>d[y]) x^=y^=x^=y;while(d[y]>d[x]) ans=max(ans,g[y]),y=f[y];if(x==y) return ans;while(x!=y){ans=max(ans,max(g[x],g[y]));x=f[x]; y=f[y];}return ans;}}ufs;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int main(){n=rd(); m=rd();for(R int i=1,op,x,y;i<=m;++i){op=rd(); x=rd()^ans; y=rd()^ans;if(op==0){++cnt;if(ufs.find(x)!=ufs.find(y)) ufs.merge(x,y);}else if(ufs.find(x)!=ufs.find(y)){ans=0;puts("0");}else printf("%d\n",(ans=ufs.lca(x,y)));}return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9748093.html

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

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

相关文章

使用容器和数据库克隆进行数据库迁移

SQL Server迁移在DBA的生命周期中是一个常量&#xff0c;SQL Server 2008的支持终结正在推动大量的迁移规划。数据库迁移通常涉及将备份还原到目标环境&#xff0c;为应用程序测试提供开发和QA环境&#xff0c;以及识别已弃用的功能。当处理涉及需要数小时恢复的大量数据库的大…

C++获取PE文件的入口点

2009-10-07 10:17 C获取PE文件的入口点 源码&#xff1a; #include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; int main(int argc, char* argv[]) { char *FileName argv[1]; HANDLE hFile CreateFile(FileName,GENE…

ai 中 统计_AI统计(第2部分)

ai 中 统计Today I plan to cover the following topics: Linear independence, special matrices, and matrix decomposition.今天&#xff0c;我计划涵盖以下主题&#xff1a;线性独立性&#xff0c;特殊矩阵和矩阵分解。 线性独立 (Linear independence) A set of vectors …

如何修改浏览器的默认滚动条样式

如何修改浏览器的默认滚动条样式 /* 浏览器滚动条样式 *//* width */ ::-webkit-scrollbar {width: 4px;height: 4px; }/* Track */ ::-webkit-scrollbar-track {background: rgb(255, 255, 255);border-radius: 8px; }/* Handle */ ::-webkit-scrollbar-thumb {background: rg…

PE

PE文件规定了可执行文件的格式&#xff0c;凡是符合此格式的文件都能在windows系统上运行。PE文件的格式暂且不谈&#xff0c;说一些感染PE文件的几种途径。 导入表感染。这个涉及比较复杂的操作&#xff0c;首先&#xff0c;要自行写一个dll文件&#xff0c;提供程序中对原dl…

python入门系列:对象引用、垃圾回收、可变性

Python中的变量是什么 引言 Python和java中的变量本质不一样&#xff0c;java的变量可以理解为一个盒子&#xff0c;用来容纳我们的对象&#xff0c;使用前要先声明它&#xff0c;好分配给我们合适的内存空间。Python的变量可以理解为一个标签&#xff0c;先构造出对象&#xf…

twitter数据分析_Twitter上最受欢迎的数据科学文章主题

twitter数据分析If you’ve written data science articles or are trying to get started, finding the most popular topics is a big help in getting your articles read. Below are the steps to easily determine what these topics are using R and the results of the …

JAVA遇见HTML——JSP篇(JSP状态管理)

案例&#xff1a;Cookie在登录中的应用 URL编码与解码的工具类解决中文乱码的问题&#xff0c;这个工具类在java.net.*包里 编码&#xff1a;URLEncoder.encode(String s,String enc)//s&#xff1a;对哪个字符串进行编码&#xff0c;enc&#xff1a;用的字符集&#xff08;例&…

PE文件讲解

我们大家都知道&#xff0c;在Windows 9x、NT、2000下&#xff0c;所有的可执行文件都是基于Microsoft设计的一种新的文件格式Portable Executable File Format&#xff08;可移植的执行体&#xff09;&#xff0c;即PE格式。有一些时候&#xff0c;我们需要对这些可执行文件进…

easyui 布局之window和panel一起使用时,拉动window宽高时panel不跟随一起变化

项目开发中布局是每一个组件都由最外层的window和内部的至少一个panel组成&#xff0c;其他的细小组件再依次放到panel中。 问题&#xff1a;当拉动外部的window时我们希望内部的panel的宽高也跟着变化&#xff0c;但是并没有&#xff0c;尤其拉动其高度是更为明显&#xff0c;…

是什么使波西米亚狂想曲成为杰作-数据科学视角

平均“命中率”是什么样的 (What an Average ‘Hit’ looks like) Before we break the song down, let us have a brief analysis of what the greatest hits of all time had in common. I have picked 1500 songs ( charting hits ) right from the ’50s to the’10s, spre…

PE文件感染和内存驻留

这次&#xff0c;作者将和大家一起讨论病毒的感染技术。另外&#xff0c;从本文开始&#xff0c;我们将陆续接触到一些病毒的高级编码技术。例如&#xff0c;内存驻留、EPO&#xff08;入口点模糊&#xff09;技术、加密技术、多态和变形等。通过这些高级技巧&#xff0c;你将进…

Python函数积累

评估函数eval() 去掉参数最外侧引号并执行余下语句的函数 fun:将让任何输入的字符串转换为python语句&#xff08;如"12132" -> 12132&#xff09;转载于:https://www.cnblogs.com/LYluck/p/10376531.html

流行编程语言_编程语言的流行度排名

流行编程语言There has never been a unanimous agreement on what the most popular programming languages are, and probably never will be. Yet we believe that there is merit in trying to come up with ways to rank the popularity of programming languages. It hel…

Attributes.Add用途与用法

Attributes.Add("javascript事件","javascript语句");如&#xff1a;this.TextBox1.Attributes.add("onblue", "window.Label1.style.backgroundColor#000000;");this.TextBox1.Attributes.Add("onblur","this.style.d…

使用UIWebView加载网页

1、使用UIWebView加载网页 运行XCode 4.3&#xff0c;新建一个Single View Application&#xff0c;命名为WebViewDemo。 2、加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 [cpp] view plaincopyprint?#import <UIKit/UIKit.h> …

Java 开源库精选(持续更新)

仅记录亲自使用和考虑使用的Apache Commons Commons IO - Commons IO 是一个帮助开发IO功能的实用程序库 Commons Configuration - Commons Configuration 提供了一个通用配置界面&#xff0c;使Java应用程序可以从各种来源读取配置数据。查看更多可重用、稳定的 Commons 组件S…

corba的兴衰_数据科学薪酬的兴衰

corba的兴衰意见 (Opinion) 目录 (Table of Contents) Introduction 介绍 Salary and Growth 薪资与增长 Summary 摘要 介绍 (Introduction) In the past five years, data science salary cumulative growth has varied between 12% in the United States, according to Glass…

hibernate的多表查询

1.交叉连接 select * from A ,B 2.内连接 可以省略inner join 隐式内连接&#xff1a; select * from A,B where A.id B.aid; 显式内连接&#xff1a; select * from A inner join B on A.id B.aid; 迫切内连接&#xff1a; 需要加上fetch关键字 内连接查询两者共有的属性…

C# 读取PE

最后分析结果会放在 一个DATASET里 ResourceDirectory这个TABLE 增加了 GUID列 为了好实现数结构 using System; using System.IO; using System.Data; using System.Collections; namespace PETEST { /// <summary> /// PeInfo 的摘要说明。 /// zgkesina.com …