95pts求助
查看原帖
95pts求助
482007
TanX_1e18楼主2023/7/25 08:54
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,k,l,r;
int a[2000009];
long long g[2000009][11],s[2000009];
long long f[2000009][11],ans;
int q[2000009],head,tail,cnt;
int main()
{
	cin>>n>>k>>l>>r;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		ans=max(ans,(long long)a[i]);
		g[i][1]=1;
		s[i]=s[i-1]+g[i][1];
	}
	if(k>1)
	ans=0;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	f[i][1]=a[i];
	for(int j=2;j<=k;j++)
	{
		int nowl=0,nowr=1;
		for(int i=1;i<=n;i++)
		{
			while(nowr<i&&a[nowr]*l<=a[i])
			nowr++;
			while(nowl<nowr&&a[nowl]*r<a[i])
			nowl++;
			int ll=1,rr=i-1;
			if(nowr<nowl)
			g[i][j]=0;
			else
			g[i][j]=(s[nowr-1]-s[nowl-1])%mod;
			g[i][j]=(g[i][j]%mod+mod)%mod;
		}
		for(int i=1;i<=n;i++)
		{
			s[i]=s[i-1]+g[i][j];
			s[i]=(s[i]%mod+mod)%mod;
		}
	}
	for(int j=2;j<=k;j++)
	{
		head=1;
		tail=0;
		q[head]=0;
		cnt=1;
		for(int i=1;i<=n;i++)
		{
			while(cnt<i&&a[i]>=a[cnt]*l)
			{
				while(head<=tail&&f[q[tail]][j-1]<f[cnt][j-1])
				tail--;
				q[++tail]=cnt;
				cnt++;
			}
			while(head<=tail&&a[q[head]]*r<a[i])
			head++;
			if(head<=tail)
			{
				if(f[q[head]][j-1]!=0)
				{
					f[i][j]=f[q[head]][j-1]+a[i];
				}
				else
				f[i][j]=0;
			}
			else
			f[i][j]=0;
			if(j==k)
			ans=max(ans,f[i][j]);
		}
	}
	cout<<s[n]<<endl;
	cout<<(ans%mod+mod)%mod;
	return 0;
} 
2023/7/25 08:54
加载中...