RT,做法是枚举最大的 200 个数作为 k,然后线性归并+双指针求当前最大答案。洛谷和 UOJ 都可以过,但是感觉可以卡掉,想了很久还是卡不掉。
代码如下,有没有 dalao 可以造组 hack。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+3;
int n,a[N],b[N],c[N];
int ans;
int Main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=n;i>=max(1,n-200);i--){
int num=0;
for(int j=i+1;j<=n;j++)
b[++num]=a[j]%a[i];
sort(b+1,b+num+1);
int now=1,len=0;
for(int j=1;j<i;j++){
while(now<=num&&a[j]>b[now]) c[++len]=b[now],now++;
c[++len]=a[j];
}
while(now<=num) c[++len]=b[now],now++;
//cout<<i<<":";for(int j=1;j<=len;j++) cout<<c[j]<<' ';cout<<endl;
ans=max(ans,(c[len]+c[len-1])%a[i]);
int id=0;
for(int j=len;j>=1;j--){
while(id+1<j&&c[id+1]+c[j]<a[i]) id++;
if(id) ans=max(ans,c[id]+c[j]);
}
}
printf("%d",ans);
return 0;
}
int main()
{
int Case=1;
while(Case--) Main();
return 0;
}