hdu4777 Rabbit Kingdom(思维题+树状数组)

从零部署思澈科技SiFli-Solution:避坑指南与实战排错 本文详细介绍了从零部署思澈科技SiFli-Solution开发环境的完整流程与实战排错指南。重点解析了Keil uVision5版本选择、Butterfli工具路径配置等关键步骤,并针对Keil路径报错、函数冲突等高频问题提供了具体解决方案,帮助开发者高效避坑,快速搭建稳定的嵌入式开发环境。 阅读详情

题目

给长度为n的数列a[],以下m个询问,

每个询问给出[li,ri],

问[li,ri]内与其他数都互质的数的个数

n,m,ai<=2e5

思路来源

https://www.cnblogs.com/alihenaixiao/p/4917359.html

题解

考虑离线做这个题,

先对所有的查询进行排序 (按照L升序排列) ,然后从左到右依次处理。

 

先处理出每个数有贡献的区间,

即这个数 [左边最近不互质数的位置,右边最近不互质数的位置] ,

处理这个,先预处理所有素因子,然后每个数内放入对应的素因子

l[i]代表i的左边最近不互质数的位置,r[i]代表i的右边最近不互质数的位置

先赋l[i]==0,r[i]==n+1的初始化,

递增遍历更新每个因子最新出现的位置,用其中最大的更新l[i]

递减遍历更新每个因子最新出现的位置,用其中最小的更新r[i]

 

现在问题就转化为了求区间 [L, R] 中有几个数的贡献区间能完整覆盖 [L, R] 区间

即L<=i<=R,且l[i]<L,r[i]>R

我们用树状数组区间和sum [L, R] 表示区间[L, R]中符合题意的个数。

假设现在需要查询 [L, R] 区间,我们可以考虑贡献区间L[i]<L的数,可以在i位置加 1,然后在R[i]位置减1。

这样处理的话必须要保证L[i]<L的值,以及i要在查询区间内,

这样如果R[i]<=R就抵消了i的贡献,R[i]>R说明i的区间完整包含[L,R],对答案造成1的贡献

 

我们每次向后移动的时候,要在树状数组中消除当前位置的数对树状数组的影响,

因为i这个值不可能包含在以i+1为左端点的区间中了,

也就是进行操作 i 位置减1,R[i]位置加1。

 

一些小细节操作简化代码的,

比如统一l[i]==0的操作,r[i]==n+1的时候也直接加不用特判

毕竟最后询问的时候答案是不会触碰到i==0和i==n+1的

 

心得

玄学卡常题还是挺毒瘤的

很考验代码功底的一道区域赛的题目

估计这题应该用线段树搞不了,很容易MLE的...

fac[]内得放素因子,直接放因子会MLE

网上的代码很多是MLE的思路来源也不例外

但的确博主的讲解很清晰让我及时补上了这道题

代码

#include<iostream>
#include<cstring>
#include<cmath> 
#include<algorithm> 
#include<vector> 
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n,m,tree[maxn],a[maxn];
vector<int>fac[maxn];//fac[i]放入i的素因子 
vector<int>to[maxn];//to[L[i]]内放入i 
int l[maxn],r[maxn];//第i个数向左和向右第一个不互质的数的位置 
int pos[maxn],ans[maxn];
int prime[maxn],cnt; 
bool ok[maxn];
struct node
{
	int l,r,id;
}q[maxn];
bool cmp(node a,node b)
{
	return a.l<b.l;
}
//因子太多 预处理因子会MLE 
void init()//预处理每个数的素因子 
{
	for(ll i=2;i<maxn;++i)
	{
		if(!ok[i])prime[cnt++]=i;
		for(int j=0;j<cnt;++j)
		{
			ll k=prime[j]*i;
			if(k>maxn)break;
			ok[k]=1;
			if(i%prime[j]==0)break;
		}
	}
	for(int i=0;i<cnt;++i)
	{
		for(int j=prime[i];j<maxn;j+=prime[i])
		fac[j].push_back(prime[i]);
	}
}
void add(int x,int v)
{
	for(int i=x;i<=n;i+=i&-i)
	tree[i]+=v;
}
int sum(int x)
{
	int sum=0; 
	for(int i=x;i>0;i-=i&-i)
	sum+=tree[i];
	return sum;
}
int main()
{
	init();
	while(~scanf("%d%d",&n,&m)&&n+m)
	{
		for(int i=0;i<=n;++i)
		{
		 if(i)scanf("%d",&a[i]); 
		 l[i]=0;r[i]=n+1;
	    }
	    for(int i=0;i<maxn;++i)
	    {
	    	pos[i]=n+1;
	    	to[i].clear();
	    }
	    //先处理右端界 
		for(int i=n;i>=1;--i)
		{
			int len=fac[a[i]].size();
			for(int j=0;j<len;++j)
			{
				int v=fac[a[i]][j];
				r[i]=min(r[i],pos[v]);
				pos[v]=i;
			}
		}
		memset(pos,0,sizeof pos);
		//再处理左端界 
	    for(int i=1;i<=n;++i)
	    {
	    	int len=fac[a[i]].size();
            for(int j=0;j<len;++j)
            {
            	int v=fac[a[i]][j];//a[i]的因子v  
            	l[i]=max(l[i],pos[v]);
            	pos[v]=i;//因子v当前出现的最大位置 
            }
            to[l[i]].push_back(i);//位置l[i]处映射i  
	    }
	    for(int i=0;i<m;++i)
	    {
	    	scanf("%d%d",&q[i].l,&q[i].r);
	    	q[i].id=i;
	    }
	    sort(q,q+m,cmp);
	    memset(tree,0,sizeof tree);
	    //注意操作在0和n+1上的对答案并不会造成影响 
		for(int i=0,j=0;i<=n;++i)
		{
			for(;j<m&&q[j].l==i;++j)
			ans[q[j].id]=sum(q[j].r)-sum(q[j].l-1);
			int len=to[i].size();
			for(int k=0;k<len;++k)
			{
				int x=to[i][k];
				add(x,1);
				add(r[x],-1);
		    }
		    if(i)add(i,-1);//防止i==0导致的死循环 
			if(r[i])add(r[i],1);//消除这个值对以后的影响 
		}
		for(int i=0;i<m;++i)
		printf("%d\n",ans[i]); 
	}
	return 0;
}

 

2026年高教社杯数学建模国赛A题解题思路:从物理方程推导到MATLAB高效求解的全流程实战指南 □所有代码能够从头运行到尾,不报错(清除workspace重新跑一遍)□论文中的每个图号、表号、公式编号与正文引用一致□附录中附上核心代码(注意:不是全部代码,而是关键求解器和后处理部分)□支撑材料压缩包包含完整代码、数据文件、README说明□摘要字数严格控制在1000字以内,突出创新点和核心结果□。 阅读详情

相关推荐

从零到一:ASTER L2数据获取的实战避坑指南

本文提供了一份详细的ASTER L2数据获取实战指南,涵盖账号注册、环境配置、数据检索、下载故障排除及后处理等关键步骤。特别针对NASA EarthData平台的隐形门槛和常见陷阱,给出了实用解决方案,帮助科研新手高效获取地表温度数据,适用于环境监测和城市热岛效应分析等领域。

weixin_29061425的博客 519

hdu4777——Rabbit Kingdom

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4777 题目大意 长度为n的序列,m次询问,每次询问 [l,r] 中与其它数不互质的数有几个。 解题思路 离线树状数组。将询问按右端点 r 从小到达排序。预处理出每个数左端与其最近的互质数位置,以及右端与其最近的互质数位置。然后维护一个树状数组,表示不合法的数的数量。最后答案就是当前询问长度 r-l+1 减去 当前区间不合法的数的数量。 树状数组维护思路,每次到一个点 i ,将其 l[i] 位置树状数组 +1,因

hhhcbw的博客,欢迎各位来访 207

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 271

HDU4777 Rabbit Kingdom 树状数组

题目大意 题目链接 杭州现场赛的H题…… 题意是给定一个长度为N的序列,然后有M个询问,每个询问是询问L到R内有多少个数和其他所有的数都互质 解题思路 首先,对于这个序列中的每一个数,我们都可以求出来在这个序列中与它相邻且互质的连续区间,然后离线处理一下询问 具体的处理方法就是,求出来所有的数的所有的互质范围有多少个包含当前询问的区间,减去所有数的前半范围到当前位置i-1的数有多少个包

浅雨歌 1236

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5138

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1261

HDU 4777 Rabbit Kingdom【树状数组】

题意:给定序列,若干询问,求给定询问区间中互质的数的个数。分析:智商太低理解了好久好久,最后还是看别人代码明白的。 设l[i]l[i]为位置为ii的元素左边第一个与w[i]w[i]不互质的数,r[i]r[i]为右边第一个与w[i]w[i]不互质的数,那么(l[i],r[i])(l[i], r[i])区间内的所有数均与w[i]w[i]互质。 假设我们从头开始扫,为了防止重复计算,我们不管ii左边的

Tuesday 844

新疆地形数据下载:30米、12.5米、5米DEM地形数据

新疆是我国陆地面积最大的省级行政区,总面积达166万平方公里。新疆的地形也十分的复杂,新疆的地形呈山脉与盆地相间排列,盆地被高山环抱,,俗称“三山夹两盆”。三山指阿尔泰山、昆仑山、天山,两盆是指塔里木盆地和准噶尔盆地。 对精度要求不高的话,可以直接使用图新地球下载 新疆30米地形数据 大小:9.26GB 来自ASTER v3的新疆30米地形数据 30米地形数据下载 新疆12.5米地形数据 12.5米DEM数据由于精度比较高,一般不会用到全省的数据,通常用的是一个地区的,因此,可以单独分

LocaSpace的博客 3495

hdu 4777 树状数组+合数分解

Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1999Accepted Submission(s): 689 Problem Description   Lo...

diaocuiguo2493的博客 299

【HCIE】FRR+BFD+OSPF与BGP联动

FRR+BFD+OSPF与BGP联动

Wenrs的博客 1996

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

🏆 前端领域优质创作者 5354

HDU 4777 Rabbit Kingdom(树状数组)

HDU 4777 Rabbit Kingdom 题目链接 题意:给定一些序列,每次询问一个区间,求出这个区间和其他数字都互质的数的个数#include #include #include #include using namespace std; const int INF = 0x3f3f3f3f; typedef long long ll; const ll N = 20

Remilia's 1206

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 644

hdu 4777 Rabbit Kingdom (2013acmicpc亚洲区域赛杭州站 H)

http://acm.hdu.edu.cn/showproblem.php?pid=4777 Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 296    Accepted Submission

ddyyxx的程序员之路 3628

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

hdu 4777 Rabbit Kingdom

离线查询树状数组。首先我们要预处理出每个兔子互质的范围,l[i],r[i]分别表示左右边界。预处理比较简单,对于每个兔子的重量质分解,分别看它所有质因子的左右最早出现的位置就是该数到左右两边能互质的范围。然后就很容易更新出l[i],r[i]了(l[i],r[i]是和wi不互质的)。               关键是解决查询。对于查询,要是直接做的话会感到无从下手的,于是我们考虑能否通过离线把所

ok_again的专栏 2516

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu 4777 Rabbit Kingdom(树状数组)

题目链接:hdu 4777 Rabbit Kingdom 题目大意:一个兔子王国,有N只兔子,每只兔子有一个重量,如果两只兔子的重量不互质,那么就会干架,现在国王想将l r之间的兔子关进监狱,它想知道会有多少只兔子不会和别的兔子干架。 解题思路:预处理出每只兔子的L,R表示向左和向右最近会与该兔子发生冲突的兔子,预处理的时候只要将每只兔子的重量分解成质因子后遍历两遍。 对于询问,将询

不慌不忙、不急不躁 2004

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

hdu 4777 Rabbit Kingdom(离线+树状数组)

题意:给出n个数,有m个查询,每次查询询问区间[L,R]中最多有多少个数与区间中其他数都不互质。 思路:首先预处理一下,把每个数的因子求出来(不包含1,因为1和任何数都互质),这个比较简单……然后再预处理一下第i个数向左最小的和它不互质的数的位置和第i个数向右和它不互质的数的位置(用lf[i]和rn[i]表示)。接下来的操作比较烦,不太好理解。先说下大体思路吧,把所有操作存起来,然后从左到右依次

绝望的乐园 3092

Hdu 4777 Rabbit Kingdom 树状数组

题意:n个兔子,每个兔子有一个w,m组询问,对于每组询问,给你一个l和r,问

黑山老猴妖的专栏 642

hdu4777 hdu 4777 Rabbit Kingdom 因子分解 + 离线树状数组

【题意】 给定N个数,M个查询,每个查询[L,R]内 与所有数互质的数的个数。所有数都小于200000. 【分析】 预处理第i个数,和他互质的数的区间[li,ri].因子分解从前往后和从后往前扫一遍即可求出。 然后问题就是求区间[L,R]被多少个[li,ri]{L<=i<=R}完全覆盖的问题了。 转化问题为求没有完全覆盖[L,R]的区间有多少个,做减法即可。 考虑...

dechi5213的博客 182

HDU - 4777 Rabbit Kingdom 预处理 + 树状数组(区间更新点查询)

传送门:HDU4777 题意:给出一个长度为n的序列和m个询问,每次询问求[l, r]区间内和区间内其他数都互质的数有多少个。 思路:对于每个位置的数先向左向右预处理出最长互质区间L[i], R[i],然后将所有询问记录下来按左端点排序,遍历每个位置pos,若该位置为某个L[i],则将树状数组 i 位置+1,R[i] 位置 - 1,若某个询问Ql == pos,则该询问就可以直接计算出答案了,

WA是一笔财富 362

HDU 4777 Rabbit Kingdom(树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4777 题意:给出一个长度为n的数列,m个询问。每次询问区间[L,R]内有多少个数字与该区间内其他所有数字互质? 思路:计算每个数字向左向右能够延伸的最大区间[L,R]使得该区间内所有数字与该数字互质。并记录对于每个位置x,哪些数字的最左侧到达了x+1。然后输入所有询问,按照左区间升序。将每个区间依...

weixin_34235105的博客 192

hdu 4777 Rabbit Kingdom 离线树状数组

杭州现场赛的H,现场的时候最后一个小时都在想这题,到底也没搞出来...当时搞出来怎么也Ag了...题意挺简单,给n个数m个查询,每个查询【L,R】,返回这个区间内有多少个数与其他任何数互质。先预处理一下,对每个数a【i】处理一个区间,使得在这个区间中a【i】和其他的数都互质,这个预处理挺简单,提前把1--20W每个数的因子存起来,然后正推一边反推一边就好了。之后从前到后遍历每个数,遍历到a[i]的

Broken Wings 1413

HDU-4777 Rabbit Kingdomom(树状数组、区间离线)

染发噶发发呆

Running Bit. 559

HDU 4777 Rabbit Kingdom(树状数组+离线预处理)

Problem Description   Long long ago, there was an ancient rabbit kingdom in the forest. Every rabbit in this kingdom was not cute but totally pugnacious, so the kingdom was in chaos in season and out

退役的铜牌狗 417

hdu 4777 Rabbit Kingdom 区间覆盖

// hdu 4777 Rabbit Kingdom 区间覆盖 // // 题目大意: // // 给n个数,有q个区间查询,求出[L,R]区间内有多少个互质的数 // // 解题思路: // // 首先我们将问题转化,互质个数 = 总的个数 - 不互质的个数. // 对于每个数,我们求一个L[i],R[i]表示分别到左右最近的与i不互质的 // 的数的位置.这个用扫描的方式,记录一下一个数因

TIMELIMITE的专栏 549

Windows 10/11下YOLOv8保姆级安装教程:从CUDA配置到第一个检测Demo(含fbgemm.dll报错解决)

本文提供Windows 10/11下YOLOv8的保姆级安装教程,涵盖从CUDA配置到第一个检测Demo的全流程,特别包含fbgemm.dll报错的解决方案。通过详细的硬件准备、驱动优化、CUDA工具链配置和PyTorch定制化安装,帮助用户高效完成YOLOv8的环境搭建,并实现工业级部署。

weixin_30607659的博客 362
上一篇: Codeforces Round #426 (Div. 2) D.The Bakery(区间dp+线段树优化+滚动数组)
下一篇: hdu3986 Harry Potter and the Final Battle(删边最短路/枚举+dijkstra)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值