分析:首先去重排序,然后枚举a[i]的倍数,找到最大的a[j],使得a[j]小于a[i]的倍数,用二分法找,然后更新一下最大值。枚举a[i]和倍数复杂度为O(nlogn),二分O(logn),总的为O(n(logn)^2)。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int maxn=200005; 6 int a[maxn],n; 7 bool have[5*maxn]; 8 inline int Dich(int t,int l){ 9 if(a[n-1]<=t)return a[n-1]; 10 if(a[l]>t)return a[l-1]; 11 int r=n-1,m=(r+l)/2; 12 while(l<r&&l!=m){ 13 if(a[m]==t)return a[m]; 14 if(a[m]>t)r=m; 15 else l=m; 16 m=(l+r)/2; 17 } 18 return a[m]; 19 } 20 int main(){ 21 cin>>n; 22 int v; 23 memset(have,0,sizeof(have)); 24 for(int i=0;i<n;i++){ 25 cin>>v; 26 if(have[v]){ 27 n--;i--; 28 continue; 29 } 30 a[i]=v; 31 have[v]=true; 32 } 33 sort(a,a+n); 34 int ans=0; 35 for(int i=0;i<n;i++){ 36 int t=a[i]*2; 37 do{ 38 int k=Dich(t-1,i+1)%a[i]; 39 if(k>ans)ans=k; 40 }while((t+=a[i])<=a[n-1]); 41 } 42 cout<<ans<<endl; 43 return 0; 44 }