【CodeForces - 485D】Maximum Value (枚举,用数组离散化,数学,取模运算,因子,筛法)

题干:

You are given a sequence a consisting of n integers. Find the maximum possible value of  (integer remainder of ai divided by aj), where 1 ≤ i, j ≤ n and ai ≥ aj.

Input

The first line contains integer n — the length of the sequence (1 ≤ n ≤ 2·105).

The second line contains n space-separated integers ai (1 ≤ ai ≤ 106).

Output

Print the answer to the problem.

Examples

Input

3
3 4 5

Output

2

解题报告:

   拿到题,涉及取模操作,要知道可肯定和因子有关,因为a%m我可以认为是模掉了(a减去了)一个m,两个m,三个m。。等等。这题就是利用这个原理,我们先把他离散化到数组中,然后枚举1~1e6(相当于去重了),如果当前数字出现过,那就枚举他的倍数。。。所以我们需要预处理一个bk数组,使得对于x,可以O(1)求出小于x的最大的数字。要记得处理数组的时候需要处理到2 * 1e6。因为你枚举是刚开始就 i + i 了,细节要注意。

实际思考的思路实际是这样:

然后考虑对于Ai来讲,其能够找到的Aj如果是Ai的因子,那么一定Ai%Aj==0.如果此时Aj是Ai的最大因子数(不包括Ai本身),那么A[ i ]%A[ j + 1 --->i-1]是会逐渐递减的,所以那么我们每一次找到一个因子数,那么期望的最大模值肯定要在A[ i ]%A[ j + 1 ]中选取,所以我们可以考虑O(n)枚举Ai然后sqrt(A[i])去枚举因子数,然后过程维护一个最大值即可。总时间复杂度O(n*sqrt(n)).

我们刚刚是在枚举因子数,所以还要话sqrt(n)的时间去算因子,反过来想,我们不妨枚举倍数。那么我们需要枚举1e6+1e6/2+1e6/3+1e6/4+.............1e6/1e6次,也就是logn的时间复杂度。(也就是 对于a%m,刚开始我们是枚举a然后找对应的m,再把m改大一点点,维护最大值。现在变成a%m去枚举m,然后找对应的a,再把a改小一点点,维护最大值。)

那么我们枚举一个数之后,枚举其倍数,对应在数组中找到比这个倍数小的最大的数,那么ans=max(ans,这个倍数小的最大的数%枚举出来的这个数);

实现方式可以二分,这样复杂度多一个log,我们也可以先预处理出来答案然后O(1)查询,详情见代码。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
ll a[MAX],ans,maxx;
int bk[MAX];
const ll INF = 0x3f3f3f3f3f;
int main() {memset(bk,-1,sizeof bk);int n;cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",a+i) , bk[a[i]] = a[i] , maxx = max(maxx,a[i]);sort(a+1,a+n+1);for(int i = 1; i<=2000050; i++) {if(bk[i] == -1) bk[i] = bk[i-1];}for(int i = 1; i<=1000050; i++) {if(bk[i] != i) continue;for(int j = 2*i; j<=2000050; j+=i) {if(bk[j-1] > i) ans = max(ans,1ll*bk[j-1]%i);}}printf("%lld\n",ans);return 0;
}

AC代码2:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
ll a[MAX],ans,maxx;
int bk[MAX];
const ll INF = 0x3f3f3f3f3f;
int main() {memset(bk,-1,sizeof bk);int n;cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",a+i) , bk[a[i]] = a[i] , maxx = max(maxx,a[i]);sort(a+1,a+n+1);for(int i = 1; i<=1000050; i++) {if(bk[i] == -1) bk[i] = bk[i-1];}for(int i = 1; i<=1000050; i++) {if(bk[i] != i) continue;for(int j = i; j<=1000050; j+=i) {if(bk[j-1] > i) ans = max(ans,1ll*bk[j-1]%i);if (bk[1000050] > i) {ans = max(ans, 1ll*bk[1000050] % i);}}}printf("%lld\n",ans);return 0;
}
/*
2
1000000 999999
*/

TLE代码:

	for(int i = 1; i<=n; i++) {for(int j = 2*a[i]; j<=2000050; j+=a[i]) {if(bk[j-1] > a[i]) ans = max(ans,bk[j-1]%a[i]);}}

不能这么写,,,如果是2e5个1,分分钟给你卡成n*2.。(当然你先去重就另说了)

所以看一个题,不能直接看数据范围算复杂度,还需要看实际实现代码的姿势的最差复杂度,或者是否有特殊样例可以卡T,避免被卡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)

题干&#xff1a; The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Flatopian government is aware of this problem. Theyre planning to build some highways so that it…

js获取php单选按钮值,js如何获取radio单选框选中的值

js中一般使用遍历的方法获取radio被选中的值&#xff0c;遍历判断每个Radio是否被选中,如果是,再取其值.123function usubmit(action){var radionum document.getElementById("userlist").userid;for(var i0;iif(radionum[i].checked){userid radionum[i].value}}w…

【EOJ Monthly 2019.02 - F】方差(数学,前缀和,积的前缀和)

题干&#xff1a; 单测试点时限: 2.0 秒 内存限制: 256 MB “放弃不难&#xff0c;但坚持一定很酷。” QQ 小方已经在体育馆苦练一天射箭了&#xff0c;但他还在坚持。 QQ 小方每天都要在朋友圈晒自己的训练记录。他一共进行了 n 次射箭&#xff0c;成绩分别是 x1,x2,⋯,x…

oracle gtx,ORACLE

Category Archives: ORACLE所有Oracle技术文章看到群里有人提出一个需求&#xff0c;一张表数据量很大&#xff0c;只想导出其中一部分列。 无论是老版本exp还是数据泵expdp&#xff0c;Oracle都提供了QUERY的功能&#xff0c;这使得查询表中部分记录的功能可以实现&#xff0c…

【牛客 - 371牛客OI周赛7-提高组A】小睿睿的等式(dp,暴力 )

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/371/A 来源&#xff1a;牛客网 小睿睿在游戏开始时有n根火柴棒&#xff0c;他想知道能摆成形如“ABn”的等式且使用的火柴棒数也恰好等于n/k的等式有多少种(BAn与ABn看作一种) 注&#xff1a; “”与…

oracle用户新增数据文件,[数据库]20200722_Oracle添加表空间、用户,用户授权

[数据库]20200722_Oracle添加表空间、用户&#xff0c;用户授权0 2020-07-25 17:00:30--创建表空间CREATE TABLESPACE aifu --表空间名 aifu LOGGING DATAFILE D:\dev_config\OracleTableSpaces\aifu.DBF SIZE 5M --数据文件路径 D:\dev_config\OracleTableSpaces AUTOEXTEND O…

【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/371/B 来源&#xff1a;牛客网 小睿睿的n个妹纸排成一排&#xff0c;每个妹纸有一个颜值val[i]。有m个询问&#xff0c;对于每一个询问&#xff0c;小睿睿想知道区间[L,R]颜值最高而编号最小的妹纸是…

matlab语言 列车平稳性指标,铁道车辆平稳性分析报告.docx

....铁道车辆平稳性分析车辆平稳性评价指标1.1 sperling平稳性指标欧洲铁路联盟以及前社会主义国家铁路合作组织均采用平稳性指数来评定车辆的运行品质。等人在大量单一频率振动的实验基础上提出影响车辆平稳性的两个重要因素。其中一个重要因素是位移对时间的三次导数,亦即(加…

【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)

A&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/372/A 来源&#xff1a;牛客网 某天&#xff0c;一只可爱的肥橘喵在路上走&#xff0c;突然遇到了一个怪人&#xff0c;那怪人自称PM6&#xff0c;“小肥喵&#xff0c;这里有一道水题&#xff0c;答对…

php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持

经测试代码如下&#xff1a;/*Utf-8、gb2312都支持的汉字截取函数cut_str(字符串,截取长度,开始长度,编码);编码默认为 utf-8开始长度默认为 0*/function cut_str($string,$sublen,$start 0,$code UTF-8){if($code UTF-8){$pa "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\x…

【牛客 - 327牛客寒假算法基础集训营2 I】处女座的测验(二)(积性函数性质,数论,素数唯一性分解,STL)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/327/I 来源&#xff1a;牛客网 现在处女座顺利的完成了测验&#xff0c;处女座想要知道知道自己输出的结果是否正确。他希望知道自己有自己输出的数中有多少对是不满足要求的。 更具体的&#xff0c…

linux监控命令执行,你可能不知道的 即时监控 Linux 使用者执行指令的三种方法...

原标题&#xff1a;你可能不知道的 即时监控 Linux 使用者执行指令的三种方法这里介绍如何在 Linux 系统上以管理者权限即时监控一般使用者所执行的任何指令。Linux 的 root 管理者可对系统进行任何的管理与操作&#xff0c;如果想要即时监控特定使用者在主机上所执行的指令&am…

【POJ - 2728】Desert King (最有比率生成树,分数规划)

题干&#xff1a; David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his country to bring water to every village. Villages which are connected to his capital village will be…

linux非权限安装bioperl,bioperl的安装

1. 对于UNIX用户(1)下载BioPerl的源代码&#xff0c;并解压。我提供两个网址&#xff1a;(2)进入该目录&#xff0c;然后执行下列命令&#xff1a;$ perl Build.PL$ ./Build test# ./Build install (注意&#xff1a;执行./Build install时必须要有系统管理员权限)BioPerl和许多…

【牛客 - 327G】处女座与复读机(可编辑距离问题,dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/327/G 来源&#xff1a;牛客网 一天&#xff0c;处女座在牛客算法群里发了一句“我好强啊”&#xff0c;引起无数的复读&#xff0c;可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查…

linux远程打开windows程序,为新手讲解Linux和Windows系统的远程桌面访问知识

很多新手都是使用Linux和Windows双系统的&#xff0c;它们之间的远程桌面访问是如何连接的&#xff0c;我们就为新手讲解Linux和Windows系统的远程桌面访问知识&#xff0c;包括所使用的软件及方法。本文所使用的Linux版本是深度操作系统&#xff0c;如果要安装该版本请参考U盘…

【51nod - 1174 】区间中最大的数(RMQ问题,ST表,模板)

题干&#xff1a; 给出一个有N个数的序列&#xff0c;编号0 - N - 1。进行Q次查询&#xff0c;查询编号i至j的所有数中&#xff0c;最大的数是多少。 例如: 1 7 6 3 1。i 1, j 3&#xff0c;对应的数为7 6 3&#xff0c;最大的数为7。&#xff08;该问题也被称为RMQ问题&am…

linux用户登录实验,Linux用户和组相关命令及实验

本文简要介绍了在Linux系统下&#xff0c;如何对账户和组进行增、删、改的操作。一、 groupaddgroupadd [选项] group_name-g GID&#xff1a;指定GID&#xff1b;默认是上一个组的GID1&#xff1b;-r: 创建系统组&#xff1b;二、 groupmod命令&#xff1a;修改组属性groupmod…

【CSU - 1980 】不堪重负的树(树上区间dp)

题干&#xff1a; 小X非常喜欢树&#xff0c;然后他生成了一个大森林给自己玩。 玩着玩着&#xff0c;小X陷入了沉思。 一棵树由N个节点组成&#xff0c;编号为i的节点有一个价值Wi。假设从树根出发前往第i个节点&#xff08;可能是树根自己&#xff09;&#xff0c;一共需要…

linux windows 域,linux加入windows域之完美解决方案

《linux加入windows域之完美解决方案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《linux加入windows域之完美解决方案(10页珍藏版)》请在人人文库网上搜索。1、linux加入windows域的理想方案原文来源&#xff1a; http:/rainbird.blog.51cto.com/笔者最近几天正在…