前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HUNNU Contest 区间最值

HUNNU Contest 区间最值

作者头像
全栈程序员站长
发布2022-01-04 09:39:43
2830
发布2022-01-04 09:39:43
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

区间求最值

Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:32768KB

Total submit users: 68, Accepted users: 45

Problem 11460 : No special judgement

Problem description

给定一个长度为N 的数组,有q个询问。每一个询问是求在数组的一段区间内那个元素的因子的个数最大。比方24的因子的个数就是8。

Input

首先是一个整数t。表示有t组測试数据,每组測试数据的第一行是一个整数N(1<=N<=10^6),第二行有N个整数ai(1<=ai<=10^6,i=1,2,…..N)表示数组的元素。 第三行有一个整数q(1<=q<=10^5),代表有q个询问,接下来每一行有两个整数。li,ri(li<=ri,li>=1,ri<=N).代表数组的一段区间,而且li+1>=li,ri+1>=ri。

Output

对于每组数据的每一个询问都输出一个整数表示在这段区间里面元素因子个数的最大值。

Sample Input

1 10 2 3 5 6 9 11 12 36 39 44 3 2 6 3 8 3 9

Sample Output

4 9 9

Problem Source

HUNNU Contest  http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11460   这题感觉非常巧妙,首先学到了怎么把给定范围因子数打表,然后 怎么减少时间复杂度。 假设打表后每次直接在给定范围内比較出最大值是会超时的,可是我们能够把前一次比較出来的最大值下标赋值出来,下次查找的话。直接从这个下标開始。会节约非常多时间。

代码语言:javascript
复制
#include <cstdio> #include <cstring> #define maxn 1000005 int find[maxn]; int num[maxn]; int main() { 	memset(find, 0, sizeof(find));//把 maxn范围内数的因子数打表 	for (int i = 1; i < maxn; i++){ 		for (int j = i; j < maxn; j += i) //每次加i就等于j扩大一倍,两倍。三倍,,。。, 			find[j]++; 	} 	int t; 	scanf("%d", &t); 	while (t--) 	{ 		int n, q; 		scanf("%d", &n); 		for (int i = 1; i <= n; i++) 		{ 			scanf("%d", &num[i]); 			//intf("%d\n",find[num[i]]); 		} 		scanf("%d", &q); 		int a, b, ans = -1; 		int aa, bb, sign; 		scanf("%d%d", &a, &b); 		aa = a, bb = b; 		for (int i = a; i <= b; i++) //先比較出第一组的最大值 保存下标 			if (ans < find[num[i]]){ 				ans = find[num[i]]; 				sign = i; 			}  		printf("%d\n", ans); 		--q;  //注意 		while (q--) 		{ 			scanf("%d%d", &a, &b);  			if (sign >= aa&&sign <= a){   //假设上一次的下标在aa和a之间。那仅仅能从a開始 				ans = -1; 				for (int i = a; i <= b; i++) 				if (ans < find[num[i]]){ 					ans = find[num[i]]; 					sign = i; 				} 			} 			else     //否则直接从bb開始,由于else的话 sign仅仅能是大于a。所以能够直接从bb開始。 			{ 				for (int i = bb; i <= b; i++) 				if (ans < find[num[i]]){ 					ans = find[num[i]]; 					sign = i; 				} 			} 			aa = a, bb = b; 			printf("%d\n", ans); 		} 	} 	return 0; }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117683.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档