有没有写过的帮帮我?
查看原帖
有没有写过的帮帮我?
285069
LSG_waterlyf楼主2020/10/13 10:28

感觉没什么问题啊,WA了7个点,绝了....

#include<bits/stdc++.h>
using namespace std;
#define N 500010
#define ll unsigned long long
ll n,a[N],s[N],k,b[N];
struct node{ll x,s;};
int check(ll mid)
{
	ll s=0,s2=0,sp=0,cnt=0;queue<node> q;
	for(int i=1;i<=n;i++) a[i]=b[i];
	for(int i=n;i>=1;i--)
	{
		if(!q.empty()) 
		{
			node t=q.front();
			while((t.x-i)*(t.x-i)>=mid)
			{
				q.pop();s-=t.x*t.s,s2-=t.x*t.x*t.s,sp-=t.s;
				if(q.empty()) break;t=q.front();
			} 
		}
		a[i]=a[i]-sp*mid+s2+sp*i*i-2*s*i;
		if(a[i]<0) continue;ll tmp=a[i]/mid+1;
		s+=i*tmp;s2+=i*i*tmp;sp+=tmp;
		cnt+=a[i]/mid+1;q.push((node){i,tmp});
	}
//	printf("mid=%lld cnt=%lld\n",mid,cnt);
	if(cnt<=k) return 1;
	else return 0;
}
int main()
{
	//freopen("Qiennys.in","r",stdin);
	//freopen("Qiennys.out","w",stdout);
	cin>>n>>k;
	for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
	ll l=1,r=1e10,mid,ans;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}
2020/10/13 10:28
加载中...