HUNNU Contest 区间最值

HUNNU Contest 区间最值

大家好,又见面了,我是全栈君,今天给大家准备了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

 

这题感觉非常巧妙,首先学到了怎么把给定范围因子数打表,然后 怎么减少时间复杂度。

假设打表后每次直接在给定范围内比較出最大值是会超时的,可是我们能够把前一次比較出来的最大值下标赋值出来,下次查找的话。直接从这个下标開始。会节约非常多时间。

 

#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.net/117683.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu安装nginx1.8.0_装了centos还可以装ubuntu吗

    ubuntu安装nginx1.8.0_装了centos还可以装ubuntu吗下载nginx包安装由于上面已经安装了nginx,所以我们先卸载nginx。再重新上传nginx包,解压下载。有输入提示时,输入Y即可卸载apt-get安装的nginx#彻底卸载nginxapt-get–purgeautoremovenginx#查看nginx的版本号nginx-v安装依赖包apt-getinstallgccapt-getinstalllibpcre3libpcre3-devapt-getinstallzlib1gzlib1

    2026年1月23日
    6
  • 10种不同画法画平行线怎么画_平行线的标准画法

    10种不同画法画平行线怎么画_平行线的标准画法数学活动《平行线的画法》活动目标:1、通过活动探究巩固熟悉平行线的判定方法,能正确地画出已知直线的平行线,并能用平行线的判定方法说明依据。2、采用多种方法画平行线,让学生从不同的角度来寻求解决问题的方案.让学生在动手操作中进一步学会画平行线,培养一定的操作技能。3、通过观察、动手操作、推断、交流等数学活动,发展空间观念,体验知识来源于生活,又服务于生活。活动重点:运用所学的知识熟练的画出平行线。活…

    2026年2月3日
    4
  • MySQL——MySQL 图形化管理工具的介绍

    MySQL——MySQL 图形化管理工具的介绍文章目录MySQL——MySQL图形化管理工具的介绍1、MySQLWorkbench2、Navicat3、SQLyog4、DBeaver5、DataGripMySQL——MySQL图形化管理工具的介绍MySQL图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MysQLWorkbench、phpMyAdmin、NavicatPreminum、MySQLDumper、SQLyog、dbeaver、MysQLODBcConnector、DataGrip。1、MySQL

    2022年6月30日
    26
  • RelativeLayout.LayoutParams学习与运用

    RelativeLayout.LayoutParams学习与运用1、了解LayoutParams其实LayoutParams就是代表一个布局属性,每一个ViewGroup对应一种LayoutParams。LinearLayout对应LinearLayout.LayoutParams,RelativeLayout对应RelativeLayout.LayoutParams。我们在XML中写的大多数属性,在代码中通过LayoutParams同样可以操作界面布局。下面以

    2022年7月17日
    17
  • 第十六届全国大学生智能汽车竞赛华南赛区_第十五届全国大学生智能汽车竞赛

    第十六届全国大学生智能汽车竞赛华南赛区_第十五届全国大学生智能汽车竞赛本文给出了第十七届全国大学生智能车竞赛华南赛区比赛各个组别的成绩和相应的统计分析。

    2022年9月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号