https://codeforces.com/contest/1118/problem/D2
n=2e5 ai 1e9 sum之和ll
tmp(先是1-mid之和) mid最大2e5 求和(1-mid) ll 2e14
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cctype>
using namespace std;
#define PI acos(-1.0)
#define mp make_pair
#define forn(i,n) for(int i=0;i<n;i++)
#define for1(i,n) for(int i=1;i<=n;i++)
#define rep(i,a,n) for(int i=a;i<n;i++)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int INF32M=0x3f3f3f3f;
const ll INF64M=0x3f3f3f3f3f3f3f3f;
const int maxn=2e5+5;
const int mod=1e9+7;
int a[maxn],n;
ll m;
bool judge(int mid) //l=2e5 r=2e5 mid=2e5 1加到2e5
{
int cnt=0;
ll tmp=0;
for1(i,n) //用n 全局
{
if(a[i]<=cnt) //减不过了 到负
break; //加0
tmp+=a[i]-cnt;
if(i%mid==0)
cnt++; //按周期 第一个周期不减 为前一半(从大到小1-mid)的和
// 多了mid前移 r前移
}
return tmp>=m;
}
int main()
{
ios::sync_with_stdio(false);
ll sum=0;
cin>>n>>m;
for1(i,n)
{
cin>>a[i];
sum+=a[i];
}
if(sum<m)
return puts("-1"),0;
sort(a+1,a+n+1);
reverse(a+1,a+n+1);
int l=1,r=n,ans=0;
while(l<=r)
{
int mid=(l+r)>>1; //范围1-2e5
if(judge(mid)) //多了的话 1-mid mid前移 r前移
{
ans=mid; //更新用最少的天数
//n=5 m=15 5 5 5 5 5 l=1 r=5 mid=3本来前3个15 ans=3
//太多了加少一点 mid=3左移 r=mid-1=2; l=1 mid=1 1天1周期cnt-- 1天够15 更新为1
r=mid-1;//缩短天数
}
else //不够 1-mid mid后移 l后移
l=mid+1;
}
cout<<ans<<endl;
return 0;
}