sicily 1876. Basic Graph Problem 线段树+并查集+路径压缩

2024-03-06 09:08

本文主要是介绍sicily 1876. Basic Graph Problem 线段树+并查集+路径压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线段树或者RMQ都可以做,虽然是不是动态变化的,但是用线段树做也不错,,而且最近才开始弄线段树,当练练手。。。

一定要路径压缩的并查集,,不然线性的话,耗时过高。。。

而且不能写递归的路径压缩,我猜得。。。

因为n<=100000,一般20000就会栈爆的,,,,

#include<iostream>

#include<cstdio>
#include<cstring>
using namespace std;
int n;
int w[100100];
struct node{
int left;
int right;
int min;
int max;
}seg[4*100000];
int father[100010];
void build(int p,int x,int y){
seg[p].left = x;
seg[p].right = y;
if(x==y){
// seg[p].left = seg[p].right = x;
seg[p].max = seg[p].min = w[x];
return ;
}
int mid = (x+y)/2;
build(2*p,x,mid);
build(2*p+1,mid+1,y);
int minl,minr,maxl,maxr;
minl = seg[2*p].min,maxl = seg[2*p].max;
minr = seg[2*p+1].min,maxr = seg[2*p+1].max;
if(minl<minr)seg[p].min = minl;
else seg[p].min = minr;
if(maxl>maxr)seg[p].max = maxl;
else seg[p].max = maxr;
}
void find(int p,int x,int y,int &min,int &max){
if(x==seg[p].left && y==seg[p].right){
min = seg[p].min;
max = seg[p].max;
return ;
}
int mid = (seg[p].left+seg[p].right)/2;
if(mid>=y){
find(2*p,x,y,min,max);
}else if(mid<x){
find(2*p+1,x,y,min,max);
}else {
int min1,min2,max1,max2;
find(2*p,x,mid,min1,max1);
find(2*p+1,mid+1,y,min2,max2);
min = min1<min2?min1:min2;
max = max1>max2?max1:max2;
return ;
}
}
int f(int a){///查找过程路径压缩
int i = a;
while(a!=father[a])a = father[a];
while(i!=a){
int tmp = father[i];
father[i] = a; 
i = tmp;
}
return a;


}
void union_set(int u,int v){
int a = f(u);
int b = f(v);
if(a==b)return ;
if(a<b)father[b] = a;
else father[a] = b;

}
int main(){
int casenum = 0;
while(scanf("%d",&n)!=EOF){

if(casenum)printf("\n");
printf("CASE %d\n",++casenum);
for(int i = 1;i<=n;i++){
scanf("%d",&w[i]);
father[i] = i;
}
build(1,1,n);
int m;
scanf("%d",&m);
int u,v;
int min,max;
for(int i = 1;i<=m;i++){
scanf("%d%d",&u,&v);
find(1,u,v,min,max);
/// printf("%d %d\n",min,max);
union_set(min,max);
}
int k;
scanf("%d",&k);
for(int i = 0;i<k;i++){
scanf("%d%d",&u,&v);
if(f(u)==f(v))printf("YES\n");
else printf("NO\n");
}
}
return 0;
}

这篇关于sicily 1876. Basic Graph Problem 线段树+并查集+路径压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779526

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图