【HDU No. 4902】 数据结构难题 Nice boat

news2024/11/27 10:44:05

【HDU No. 4902】 数据结构难题 Nice boat

杭电OJ 题目地址

在这里插入图片描述

【题意】

有n 个数字a 1 , a 2 , …, an ,每次都可以将[l , r ]区间的每个数字都更改为数字x (类型1),或将[l ,r ]区间每个大于x 的ai 都更改为最大公约数gcd(ai , x )(类型2),请输出最后的序列。

【输入输出】

输入:

第1行包含一个整数T ,表示测试用例的数量。每个测试用例的第1行都包含整数n 。下一行包含以空格分隔的n 个整数a 1 , a 2 ,…, an 。再下一行包含一个整数Q ,表示操作数量。下面的Q 行,每行都包含4个整数t 、l 、r 、x ,t 表示操作类型,l 、r 表示区间左右端点。T ≤2,n , Q ≤100000,ai , x ≥0且在int32范围内。

输出:

对每个测试用例,都单行输出以空格分隔的最终序列,在序列结束后输出一个空格。

【样例】

在这里插入图片描述

【思路分析】

本题是很明显的区间更新问题,但不仅仅是简单的区间更新,而是将[l , r ]区间每个大于x 的ai 都更改为gcd(ai , x )。

【算法设计】

① 创建线段树。

② 区间更新(类型1),将[l , r ]区间的每个数字都更改为数字x。

③ 区间更新(类型2),将[l , r ]区间每个大于x 的ai 都更改为gcd(ai , x )。

【举个栗子】

① 创建线段树。根据输入样例,首先输入10个数,将其存储在数组中。

在这里插入图片描述

由于数值较大,为了方便起见,在下图中标记的是数值对应的下标,在程序中记录的是数值自身data[i ]。初时化时,区间最大值、懒标记等于数据自身,maxs[i ]=lazy[i ]=data[i ]。

在这里插入图片描述

② 1 3 6 74243042:将[3, 6]区间的值修改为x (x=74243042,用下标11标识)。找到[3, 3]、[4, 5]、[6, 6]区间,更新这些区间的懒标记和最大值为x ,返回时更新最大值。

在这里插入图片描述

③ 2 4 8 16531729:将[4, 8]区间大于x (x =16531729)的值修改为两者的最大公约数。首先找到[4, 5]、[6, 8]区间。[4, 5]区间带有懒标记,因此更新该区间的懒标记和最大值:lazy[i]=gcd(lazy[i ], x )=1,maxs[i ]=lazy[i ]=1。返回时更新最大值。[6, 8]区间没有懒标记,说明该区间的数值不同,因此继续查找左右子树,更新[6, 6]、[7, 7]、[8, 8]区间。该区间的懒标记lazy[i]=gcd(lazy[i ], x )=1,最大值maxs[i ]=lazy[i ]=1。返回时更新最大值。

在这里插入图片描述

④ 1 3 4 1474833169:将[3, 4]区间的值修改为x (x=1474833169,用下标12标识)。找到[3, 3]、[4, 4]区间,更新这些区间的懒标记和最大值为x ,返回时更新最大值。在查找区间的过程中因为[4, 5]区间带有懒标记,所以懒标记下传,再更新[4, 4]区间。

在这里插入图片描述

⑤ 2 1 8 1131570933:将[1, 8]区间大于x (x =1131570933)的值修改为两者的最大公约数。首先找到[1, 5]、[6, 8]区间。[6, 8]区间的最大值比x 小,什么也不做。[1, 5]区间没有懒标记,说明该区间内的数值不同,因此继续查找左右子树,更新[1, 2]、[3, 3]、[4,4]、[5, 5]区间,其中[1, 2]、[5, 5]区间的最大值比x 小,什么也不做。只需更新[3, 3]、[4, 4]区间的懒标记和最大值:lazy[i]=gcd(lazy[i ], x )=1,maxs[i ]=lazy[i ]=1,返回时更新最大值。

在这里插入图片描述

⑥ 2 7 9 1505795335:将[7, 9]区间大于x (x =1505795335)的值修改为两者的最大公约数。首先找到[7, 7]、[8, 8]、[9, 9]区间,这3个区间的最大值比x 小,什么也不做。

⑦ 2 3 7 101929267:将[3, 7]区间大于x (x =101929267)的值修改为两者的最大公约数。首先找到[3, 3]、[4, 5]、[6, 7]区间,这3个区间的最大值比x 小,什么也不做。

⑧ 1 4 10 1624379149:将[4, 10]区间的值修改为x (x=1624379149,用下标13标识)。找到[4, 5]、[6, 10]区间,更新这些区间的懒标记和最大值为x ,返回时更新最大值。

在这里插入图片描述

⑨ 2 2 8 2110010672:将[2, 8]区间大于x (x =2110010672)的值修改为两者的最大公约数。首先找到[1, 10]区间,该区间的最大值比x 小,什么也不做。

⑩ 2 6 7 156091745:将[6, 7]区间大于x (x =156091745)的值修改为两者的最大公约数。首先找到[6, 7]区间,在查找过程中经过的[6, 10]区间带有懒标记,懒标记下传,一直找到[6, 7]区间,该区间带有懒标记,因此更新该区间的懒标记和最大值:lazy[i]=gcd(lazy[i ], x )=1,maxs[i ]=lazy[i ]=1,返回时更新最大值。

在这里插入图片描述

⑪ 1 2 5 937186357:将[2, 5]区间的值修改为x (x=937186357,用下标14标识)。找到[2, 2]、[3, 3]、[4, 5]区间,更新这些区间的懒标记和最大值为x ,返回时更新最大值。

在这里插入图片描述

⑫ 输出结果。因为节点可能带有懒标记,因此在查找叶子的过程中懒标记下传,然后输出叶子即可。上图中[4, 5]、[6, 7]、[9,10]区间带有懒标记,懒标记下传后如下图所示。

在这里插入图片描述

所有叶子节点的数据为1、937186357、937186357、937186357、937186357、1、1、1624379149、1624379149、1624379149。

【算法实现】

① 区间更新(类型1)。将[l , r ]区间的每个数字都更改为数字x ,找到区间后更新最大值为x 。在查找过程中下传懒标记,返回时更新最大值。

void update1(int x,int L,int R,int l,int r,int i) // 将[L,R] 区间的每个数字都更改为数字 x
{
    if(L<=l&&r<=R) // 区间覆盖
    {
        lazy[i]=maxs[i]=x; // 懒标记,最大值
        return ;
    }
    PushDown(i); // 下传懒标记
    int mid=(l+r)>>1; 
    if(L<=mid)
    	update1(x,L,R,ls); // #define ls l , mid ,i << 1
    if(R>mid)
    	update1(x,L,R,rs); // #define rs mid + 1 , r , i << 1 | 1
    PushUp(i); // 上传、更新最大值
}

② 区间更新(类型2)。将[l , r ]区间每个大于x 的ai 都更改为gcd(ai , x )。若该区间的最大值小于或等于x ,则什么也不做,因此在操作过程中可记录区间最大值,提高效率。若懒标记不为0,且待更新区间覆盖当前节点区间,则lazy[i ]=gcd(lazy[i ], x ),maxs[i ]=lazy[i ],返回。懒标记下传,更新左右子树,返回时更新最大值。

void update2(int x,int L,int R,int l,int r,int i)
{
    if(maxs[i]<=x) return ;
    if(lazy[i]&&L<=l&&r<=R)
    {
        lazy[i]=gcd(lazy[i],x); // gcd() 为求最大公约数
        maxs[i]=lazy[i];
        return ;
    }
    PushDown(i); // 懒标记下传
    int mid=(l+r)>>1; 
    if(L<=mid)
    	update2(x,L,R,ls);
    if(R>mid)
    	update2(x,L,R,rs);
    PushUp(i); // 上传、更新最大值
}

[完整AC代码]

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define N 100005
#define lson i<<1
#define rson i<<1|1
#define ls l,mid,i<<1
#define rs mid+1,r,i<<1|1

int maxs[N<<2],lazy[N<<2];
int n,m;

int gcd(int a,int b)//最大公约数 
{
    if(!b) return a;
    else return gcd(b,a%b);
}
void PushUp(int i)//上传 
{
    maxs[i]=max(maxs[lson],maxs[rson]);
}
void PushDown(int i)//下传 
{
    if(lazy[i])
    {
        lazy[lson]=lazy[rson]=lazy[i];
        maxs[lson]=maxs[rson]=maxs[i];
        lazy[i]=0;
    }
}
void build(int l,int r,int i)
{
    if(l==r)
    {
    	scanf("%d",&lazy[i]);
    	maxs[i]=lazy[i];
    	return ;
	}
    int mid=(l+r)>>1;
    build(ls);
    build(rs);
    PushUp(i);
}
 
void update1(int x,int L,int R,int l,int r,int i)
{
    if(L<=l&&r<=R)
    {
        lazy[i]=maxs[i]=x;
        return ;
    }
    PushDown(i);
    int mid=(l+r)>>1;
    if(L<=mid)
    	update1(x,L,R,ls);
    if(R>mid)
    	update1(x,L,R,rs);
    PushUp(i);
}
 
void update2(int x,int L,int R,int l,int r,int i)
{
    if(maxs[i]<=x) return ;
    if(lazy[i]&&L<=l&&r<=R)
    {
        lazy[i]=gcd(lazy[i],x);
        maxs[i]=lazy[i];
        return ;
    }
    PushDown(i);
    int mid=(l+r)>>1;
    if(L<=mid)
    	update2(x,L,R,ls);
    if(R>mid)
    	update2(x,L,R,rs);
    PushUp(i);
}
 
void print(int l,int r,int i)
{
    if(l==r)
    {
    	printf("%d ",lazy[i]);
    	return ;
	}
	PushDown(i);
    int mid=(l+r)>>1;
    print(ls);
    print(rs);
}

void print2(int l,int r,int i)//测试 
{
	if(maxs[i])
	{
		printf("%d %d\n",lazy[i],maxs[i]);
	    int mid=(l+r)>>1;
	    print2(ls);
	    print2(rs);
	}
}

int main()
{
	
    int T,l,r,opt;
    int x;
    scanf("%d",&T);
	
    while(T--)
    {
        scanf("%d",&n);
        build(1,n,1);
        //print2(1,n,1);
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d%d%d%d",&opt,&l,&r,&x);
            if(opt==1) update1(x,l,r,1,n,1);
            else update2(x,l,r,1,n,1);
            //print2(1,n,1);
        }
        print(1,n,1);
        printf("\n");
    }
	
    return 0;
}

在这里插入图片描述

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

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

相关文章

云服务连续三年增长150%,网宿科技开拓新赛道

摘要&#xff1a;开拓云服务市场&#xff0c;网宿科技的打法。 提到网宿科技&#xff0c;很多人还停留在传统IT服务商的印象中。其实&#xff0c;网宿科技已经在一条新赛道加速前行&#xff0c;这就是云服务。 “借助亚马逊云科技的持续赋能&#xff0c;网宿科技积累了丰富的云…

swiper轮播图片+视频播放,预览及页面跳转功能

1.效果 2.上代码 <template> <swiper :circulartrue indicator-dots"true" change"changeSwiper" :autoplay"true" interval5000 classswiper-view><swiper-item class"swiper-img" v-for"(item,index) in swipe…

2022 CMU15-445 Project0 Trie

通过截图 在线测试 本地测试 总览 代码风格 我们的代码必须遵循 Google C Style Guide。在线检测网站使用 Clang 自动检查源代码的质量。如果我们的提交未通过任何这些检查&#xff0c;您的项目成绩将为零。 对于 Google C Style Guide &#xff0c;我们可以看这里 google-s…

Spring Boot Logback启动流程

Spring Boot 默认使用的是 Logback 的日志框架、Logback 的组件主要通过 Spring Boot ApplicationListener 启动的 // LoggingApplicationListener Override public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApp…

测试工作中的测试用例设计

测试工作中的测试用例设计 测试工作的最核心的模块&#xff0c;在执行任何测试之前&#xff0c;首先必须完成测试用例的编写。测试用例是指导你执行测试&#xff0c;帮助证明软件功能或发现软件缺陷的一种说明。 进行用例设计&#xff0c;需要对项目的需求有清晰的了解&#xf…

Excel找回打开密码过程

Excel文件设置了打开密码&#xff0c;但是忘记了打开密码或者不知道这份文件的打开密码都没办法打开excel文件了。可是文件的打开密码&#xff0c;一旦忘记了&#xff0c;想要再打开文件&#xff0c;都是需要找回密码的。网上的一些绕过密码、直接删除密码都是无效的解决方法。…

C# 文件压缩解压与sqlite存储文件数据

文章目录环境压缩nugetUI代码资源链接&#xff08;下载地址&#xff09;ZipFile 类方法环境 .netframerwork4.8sqlite3 压缩 nuget <package id"System.IO.Compression" version"4.3.0" targetFramework"net48" /><package id"…

四嗪-五聚乙二醇-羧基,1682653-79-7,Tetrazine-PEG5-COOH 水溶性和稳定性怎么样?

●中文名&#xff1a;四嗪-五聚乙二醇-羧基 ●英文&#xff1a;Tetrazine-PEG5-COOH ●外观以及性质&#xff1a;Tetrazine-PEG5-COOH为红色固体&#xff0c;四嗪目前被广泛应用于蛋白质特定位点功能阐释、亚细胞结构选择性标记。四嗪PEG衍生物用于与 TCO&#xff08;反式环辛烯…

【Linux初阶】操作系统概念与定位 | 操作系统管理硬件方法、系统调用和库函数概念

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;操作系统的基础概念、设计OS的目的&#xff0c;操作系统的定位&#xff0c;操作系统管理硬件方法&#xff0c;…

【正厚软件干货】我推荐你的入门编程语言选python

By——正厚技术极客陈多多 当友友看到这篇文章的时候&#xff0c;心里一定有一个学习编程的想法&#xff0c;但是又不知道挑选哪个作为入门语言&#xff01;我写这篇文章就是为了帮有困难的你做出选择&#xff01;&#xff08;作者本人有选择困难症&#xff0c;当时也纠结了好久…

图神经网络关系抽取论文阅读笔记(五)

1 依赖驱动的注意力图卷积网络关系抽取方法&#xff08;Dependency-driven Relation Extractionwith Attentive Graph Convolutional Networks&#xff09; 论文&#xff1a;Dependency-driven Relation Extraction with Attentive Graph Convolutional Networks.ACL 2021 1.1 …

Win11系统禁止关机键关机的方法教学

Win11系统禁止关机键关机的方法教学。在操作电脑的时候&#xff0c;有用户经常出现自己误触关键按键导致电脑关机的情况。对于这个情况&#xff0c;我们可以去开启电脑禁止关机按键关机的设置。这样就可以不用担心误触导致关机的问题了。一起看看设置的方法吧。 操作方法&#…

OFFER狂魔成长指南

OFFER OFFER狂魔成长指南 前言 本文章是总结了我春招的经历&#xff0c;博主背景为211某流计算机专业&#xff0c;考研失败转春招。因为计划会再考一年因此主要面试的偏国企专业&#xff08;现在放弃了&#xff0c;因为公司里面校招生就我一个本科&#xff0c;其他都是21198…

基于VDI2230规范的螺栓评估(上)

作者&#xff1a;王庆艳&#xff0c;安世中德工程师&#xff0c;仿真秀科普作者 一、写在前面 【螺栓评估准则】&#xff1a;VDI2230&#xff08;高强度螺栓连接系统计算&#xff09;规范是德国工程师协会负责编写整理&#xff0c;包括Part1及Part2两部分&#xff0c;是目前针…

(5)点云数据处理学习——其它官网例子2

1、主要参考 &#xff08;1&#xff09;官方稳定地址 Point cloud — Open3D 0.16.0 documentation 2、相关功能 2.1凸包&#xff08;Convex hull&#xff09; &#xff08;1&#xff09;函数 compute_vertex_normals create_from_triangle_mesh &#xff08;2&#xff09;…

Three.js教程之在网页快速实现 3D效果(教程含源码)

介绍 本文概述了与使用 Three.js 在常规 Web 浏览器中直接在 Web 上制作 3D 图形相关的术语和概念。对于 3D,就像任何主题一样,如果您深入了解所有细节,事情会很快变得复杂。我将尝试做相反的事情,并简单概述您在学习如何在常规 Web 浏览器中制作 3D 时会遇到的所有概念。 …

手把手教你用站长工具综查询网站域名在各个平台的权重情况 站长工具综查询

网站权重是根据流量值来判断网站的权重值。权重值是属于第三方评估就有参考的意义。 了解网站的权重可以助于SEO专员找到工作的方向。使用站长工具综合查询可以看到网站在各个平台的权重情况。 用站长工具综合查询网站在各个平台的权重情况的操作步骤吧&#xff01; 第一步、打…

德云一哥岳云鹏,准备录制河南和东方卫视节目,央视春晚还参加吗

时间如白驹过隙&#xff0c;转眼马上又要过年了&#xff0c;央视春晚也备受关注&#xff0c;不知道今年春晚究竟有哪些明星登台演出。说起央视春晚舞台&#xff0c;就不得不说起相声和小品&#xff0c;这两个节目是春晚的台柱子&#xff0c;也一直深受大家的喜爱。 尤其是最近几…

Linux基础概念,目录文件操作命令,压缩命令:

Linux基础概念&#xff1a; 1&#xff0c;linux登录方式&#xff0c;本地登录&#xff0c;远程登录&#xff08;借助xshell等&#xff09; 登录后是shell交互界面&#xff0c;用c编写的程序。常见的就是bash&#xff0c;sh&#xff0c;csh&#xff0c;ksh等。 2&#xff0c;li…

项目实战——Web自动化测试

目录 一、前言及测试用例设计 二、 首页测试&#xff08;未登录&#xff09; 三、注册测试 四、对局列表测试 五、排行榜测试 六、对战测试 七、Bot测试 八、测试套件Suite 一、前言及测试用例设计 整个项目已经部署完成&#xff0c;我们历经九九八十一难&#xff0c;…