Maximum Value CodeForces - 485D

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.

Example
Input
3
3 4 5
Output
2

乱搞的优化,然后就过了23333.

不难想找到大于等于倍数的第一个数。然而看上去复杂度应该比较勉强n*logn可以过。两个优化。

#include <bits/stdc++.h>

using namespace std;
const int MAXN = 2e5+5;
int n;
int num[MAXN];

int main()
{

    scanf("%d",&n);
    for(int i = 0; i < n; ++i)scanf("%d",&num[i]);
    sort(num,num+n);
    int ans = 0;
    for(int i = n-1; i >=0 ; --i)
    {
        if(ans > num[i] - 1)break;
        if(num[i] == num[i+1])continue;
        for(int j = num[i]<<1; ; j+=num[i])
        {
            int d = lower_bound(num+i+1,num+n,j) - num;
            d--;
            //cout << num[i]<<" " <<num[d] <<" "<<num[d] % num[i]<< endl;
            d = num[d] % num[i];
            ans = ans>d?ans:d;
            if(j > num[n-1])break;
        }
    }
    printf("%d\n",ans);
    return 0;
}
/*
6
4 7 9 10 12 18 30
8
10
1 7 8 4 5 6 9 85 14 20
6
20
1 7 8 6 4 2 9 5 12 15 20 45 82 65 24 54 456 123 754 654
298
*/
第二个优化最关键,避免二分时一直到上届吧。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值