10pts求助
查看原帖
10pts求助
941575
Stars_visitor_tyw楼主2024/4/9 16:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n, k, l, r, sum[N], lg[N], dp[N][20], pos[N][20];
struct node
{
	int st, ed, lt, rt, val;
	bool operator<(const node &b)const
	{
		return val<b.val; 
	}
};
priority_queue<node> q;
void init()
{
	for(int j=1;j<=lg[n];j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			if(dp[i][j-1]>dp[i+(1<<(j-1))][j-1])
			{
				dp[i][j]=dp[i][j-1];
				pos[i][j]=pos[i][j-1];
			}
			else
			{
				dp[i][j]=dp[i+(1<<(j-1))][j-1];
				pos[i][j]=pos[i+(1<<(j-1))][j-1];
			}
		}
	}
	return ;
}
int query(int lt, int rt)
{
	int t, tmp=lg[r-l+1];
	if(dp[lt][tmp]>dp[rt-(1<<tmp)+1][tmp])
	{
		t=pos[lt][tmp];
	}
	else
	{
		t=pos[rt-(1<<tmp)+1][tmp];
	}
	return t;
}
void makenode(int st, int ed, int lt, int rt)
{
	node tmp={st, ed, lt, rt, sum[ed]-sum[st-1]};
	q.push(tmp);
}
signed main()
{
	cin>>n>>k>>l>>r;
	lg[0]=-1;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		sum[i]=sum[i-1]+x;
		lg[i]=lg[i>>1]+1;
		dp[i][0]=sum[i];
		pos[i][0]=i; 
	}
	init();
	for(int i=1;i+l-1<=n;i++)
	{
		int t=query(i+l-1,min(n,i+r-1));
		makenode(i,t,i+l-1,min(n,i+r-1));
	}
	int ans=0;
	for(int i=1;i<=k;i++)
	{
		node cur=q.top();
		q.pop();
		ans+=cur.val;
		if(cur.ed-1>=cur.lt)
		{
			int t=query(cur.lt,cur.ed-1);
			makenode(cur.st,t,cur.lt,cur.ed-1);
		}
		if(cur.ed+1<=cur.rt)
		{
			int t=query(cur.ed+1,cur.rt);
			makenode(cur.st,t,cur.ed+1,cur.rt);
		}
	}
	cout<<ans;
}
2024/4/9 16:45
加载中...