二分答案,求解时,采用了容斥。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int a[MAXN],b[MAXN];
long long n;
long long mul(long long x)
{
if(x<=0)
return 0;
return x*(x-1)/2;
}
long long cal(int x)
{
long long i,ret=0,lef=0,bef=0;
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
{
b[a[i]]++;
if(b[a[i]]>x)
{
ret+=mul(i-lef-1);
ret-=mul(bef-lef-1);
while(b[a[i]]>x)
{
lef++;
b[a[lef]]--;
}
bef=i;
}
}
ret+=mul(i-lef-1);
ret-=mul(bef-lef-1);
return ret;
}
int main()
{
long long k,i,lef,rig,mid,r;
while(scanf("%lld%lld",&n,&k)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
r=int(unique(b+1,b+n+1)-(b+1));
for(i=1;i<=n;i++)
a[i]=int(lower_bound(b+1,b+r+1,a[i])-b);
k=mul(n)-k+1;
lef=0;rig=n;
while(lef<=rig)
{
mid=(lef+rig)>>1;
if(cal(mid)<k)
lef=mid+1;
else
rig=mid-1;
}
printf("%lld\n",lef);
}
}