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)
上一篇 2022年1月1日 下午11:00
下一篇 2022年1月1日 下午11:00


相关推荐

  • spring源码分析之如何解决循环依赖

    spring源码分析之如何解决循环依赖

    2021年8月4日
    53
  • backtrack3(BT3) usb版 激活成功教程WIFI无线网络密码详细步骤

    backtrack3(BT3) usb版 激活成功教程WIFI无线网络密码详细步骤好像很多朋友都在找这东西,我来发上来吧!软件BAIDU一下就有得下了!一、先开始制作启动U盘:将下载好的backtrack3(BT3)usb版(下载地址在文章末尾)文件bt3b141207.rar直接解压到U盘(1G以上容量)。把Boot和BT3两个文件夹放到U盘的根目录,打开BOOT文件夹双击运行”bootinst.bat”批处理文件。U盘里就会多出4个文件.”isolinux.b…

    2022年10月1日
    7
  • 分析方法3—PEST

    分析方法3—PEST什么时候需要进行行业分析呢?当个人在对自己进行职业规划,思考选择哪个行业更好的时候;当公司需要对外部环境或者行业竞争对手有所了解,制定发展规划的时候;当面对重大问题,需要分析行业问题的时候。如何进行行业分析呢?就是用PEST分析方法。PEST分析方法是对公司发展宏观环境的分析,所以经常用于行业分析。通常是从政策、经济、社会和技术这四个方面来分析的.2.3.2如何使用行业分析方法?现在通过一个具体的例子来看下如何应用PEST分析方法。政策环境主要包括政府的政策、法律等。例如可以从这样几个问题

    2022年5月29日
    37
  • Java 集合概览

    Java 集合概览JavaCollectionAPI提供了一些列的类和接口来帮助我们存储和管理对象集合。其实Java中的集合工作起来像是一个数组,不过集合的大小是可以动态改变的,而且集合也提供了更多高级功能。有了JavaCollectionAPI,我们就不需要自己编写集合类了,大部分Java集合类都位于java.util包里面,还有一些和并发相关的集合类位于java.util.concurrent包中。下面就介绍

    2022年7月16日
    22
  • Jediscluster_唧唧pc客户端

    Jediscluster_唧唧pc客户端前言:由于spring-data-redis不支持,redis集群的操作。所以更换客户端,使用Jediscluster。正文:一.序言   前面搭建了个3个msater-slave的本地集群测试,这里用java的客户端进行一些简单测试,看看集群是否生效。   redisclient推荐:http://redis.io/clients 

    2022年10月14日
    3
  • cisco配置hsrp配置实例

    cisco配置hsrp配置实例1 实验环境使用 ciscopackett 模拟器实现网络拓扑配置 交换机使用 3560 路由器使用 2911 显示所有端口 Options gt Preferences gt 选中 AlwaysShowPo 2 网络拓扑如下 3 具体配置 PC1 目前只需要配置基础 ip 即可 我们使用路由器来模拟 PC 机 Router gt en

    2025年8月20日
    5

发表回复

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

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