二分k值+排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[N];
ll d[N];
int n;
ll S;
int p(ll s)
{
ll ret=0;
while(1)
{
if(ret*ret*ret+ret*ret<=2*s)
ret++;
else return ret-1;
}
}
ll sp(ll k,ll s)
{
for(int i=1;i<=n;i++)
d[i]=a[i]+i*k;
sort(d+1,d+n+1);
ll t=0;
for(int i=k;i>=1;i--)
{
t+=d[i];
if(t>s) return -1;
}
return t;
}
int main()
{
scanf("%d%lld",&n,&S);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int l=0,r=min(n,p(S));
int ans=0;
ll ans0=0;
while(l<r)
{
int m=(r+l)>>1;
ll ret=sp(m,S);
if(ret!=-1)
{
ans=m;
ans0=ret;
l=m+1;
}
else
{
r=m;
}
}
ll ret=sp(r,S);
if(ret!=-1) ans=r,ans0=ret;
printf("%d %lld\n",ans,ans0);
return 0;
}