RE 了第 13,14,23,24,54 个点,本地对拍无果
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
struct node
{
ll nxt,to;
}e[400010];
ll head[400010],a[400010],sum[400010],s[400010],fa[400010],top,cnt;
void add(ll u,ll v)
{
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs(ll x,ll k)
{
top++;
s[top]=x;
fa[x]=(top>=k)?s[top-k]:0;
for(ll i=head[x];i!=0;i=e[i].nxt)
{
dfs(e[i].to,k);
}
top--;
}
ll check(ll mid,ll n,ll k)
{
cnt=top=0;
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
memset(fa,-1,sizeof(fa));
for(ll l=1,r=1;l<=2*n;l++)
{
while(r<=2*n-1&&sum[r]-sum[l-1]<mid)
{
r++;
}
add(r+1,l);
}
for(ll i=2*n+1;i>=1;i--)
{
if(fa[i]==-1)
{
dfs(i,k);
}
}
ll ans=0;
for(ll i=1;i<=n;i++)
{
ans+=(fa[i]!=0&&fa[i]<=i+n);
}
return ans;
}
int main()
{
ll n,k,l=0,r=2e9,mid,tmp,ans1=0,ans2=0,i;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
a[i+n]=a[i];
}
for(i=1;i<=2*n;i++)
{
sum[i]=sum[i-1]+a[i];
}
while(l<=r)
{
mid=(l+r)/2;
tmp=check(mid,n,k);
if(tmp>=1)
{
ans1=mid;
ans2=tmp;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans1<<" "<<n-ans2<<endl;
return 0;
}