hdu 4630 树状数组+离线操作+GCD

2024-05-28 04:48

本文主要是介绍hdu 4630 树状数组+离线操作+GCD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=4630

重新认识了树状数组。

首先要记住那个树形的图,然后+或-lowbit(i)是自己根据具体问题设定的,不要死于+或者-,

树状数组的特点:
1、+lowbit(i)可以到达包含结点i的上一层父节点    所以用于值的更改

2、-lowbit(i)可以到达不包含i所代表区间的上一层父节点  所以用于值的求和---每个不相交的段加起来

3、C[i]的含义也是根据具体问题去做设定的,但是c[i]覆盖了a[i-2^lowbit(i)+1]...a[i]这个长为lowbit(i)的区间

然后谈本题:

pre[i]见注释

当读到num[i]的时候,对num[i]的每个因子v,[1...pre[v]]都更新max(v,c[j]) ,因为此时离线处理的时候,会处理区间[l,r]的r==i的区间,把[1...pre[v]]都更新max(v,c[j]) ,就保证了查询l<=pre[v]的时候,包含了max(v,c[j]) ,而l>pre[v]的查询,不包含v的影响


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)const int MAXN = 50000+100;
struct Query{int l,r;int id;bool operator < (const Query &t)const{return r<t.r;}
}q[MAXN];
int N,c[MAXN*2],pre[MAXN],num[MAXN],ans[MAXN];//
inline int lowbit(int x){return x&(-x);}
void update(int i, int v)
{while(i>0){c[i]=max(c[i],v);i-=lowbit(i);}
}
int query(int x)
{int ret=0;while(x<=N){ret=max(c[x],ret);x+=lowbit(x);}return ret;
}vector<int>divs[MAXN];
void caldivs()
{for(int i=1;i<MAXN;i++)for(int j=i;j<MAXN;j+=i)divs[j].push_back(i);
}void init()
{CL(c,0);CL(pre,0);
}int main()
{//IN("hdu4630.txt");int ncase;caldivs();scanf("%d",&ncase);while(ncase--){init();scanf("%d",&N);for(int i=1;i<=N;i++)scanf("%d",&num[i]);int Q;scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+1+Q);for(int i=1,k=1;i<=N;i++){int x=num[i];for(int j=0;j<divs[x].size();j++){int y=divs[x][j];if(pre[y])//说明现在y是第二次出现 前一次出现位置是pre[y],此次是iupdate(pre[y],y);//维护c[i]为pre[y]到i的gcdpre[y]=i;}while(q[k].r==i && k<=Q){ans[q[k].id]=query(q[k].l);k++;}}for(int i=1;i<=Q;i++){printf("%d\n",ans[i]);}}return 0;
}


这篇关于hdu 4630 树状数组+离线操作+GCD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

Python操作Excel的实用工具与库openpyxl/pandas的详细指南

《Python操作Excel的实用工具与库openpyxl/pandas的详细指南》在日常数据处理工作中,Excel是最常见的数据文件格式之一,本文将带你了解openpyxl和pandas的核心用法,... 目录一、openpyxl:原生 Excel 文件操作库1. 安装 openpyxl2. 创建 Exc