求调RE
查看原帖
求调RE
848964
hzoi_Shadow楼主2024/9/13 16:21

RERE 了第 13,14,23,24,5413,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;
}
2024/9/13 16:21
加载中...