听取 WA RE 声一片
查看原帖
听取 WA RE 声一片
1254085
ZJ_lzz楼主2024/12/1 13:01

求助大佬

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[1005];
long long smax[1005][20];
void ST() 
{
    for(int i=1;i<=n;i++) 
	{
		smax[i][0]=i;
	}
    for(int j=1;(1<<j)<=n;j++)
    {
    	for(int i=1;i+(1<<j)-1<=n;i++) 
		{
            int x=smax[i][j-1],y=smax[i+(1<<(j-1))][j-1];
            smax[i][j]=a[x]>a[y]?x:y;
        }
	}
}
int query(int l,int r) 
{
    int k=log2(r-l+1);
    int x=smax[l][k],y=smax[r-(1<<k)+1][k];
    return a[x]>a[y]?x:y;
}
class Node
{
public:
    int o,l,r,t;
    long long data;
    Node()
	{
		
	}
    Node(int o,int l,int r)
	{
        this->o=o;
        this->l=l;
        this->r=r;
        this->t=query(l,r);
        this->data=a[t]-a[o-1];
    }
    friend bool operator<(const Node&o1,const Node&o2) 
	{
        return a[o1.t]-a[o1.o-1]<a[o2.t]-a[o2.o-1];
    }
};
int main()
{
    int k,L,R;
    cin>>n>>k>>L>>R;
    a[0]=0;
    for(int i=1;i<=n;i++) 
	{
        cin>>a[i];
        a[i]+=a[i-1];
    }
    ST();
    priority_queue<Node> prq;
    for(int i=1;i<=n;++i)
	{
        if(i+L-1<=n)
		{
            Node no(i,i+L-1,min(i+R-1,n));
            prq.push(no);
        }
    }
    long long ans = 0;
    while(k--)
	{
        Node no=prq.top();
        int o=no.o;
		int r=no.r; 
		int l=no.l; 
		int t=no.t;
        ans+=no.data;
        prq.pop();
        if(t!=l) 
		{
            Node nn(o,l,t-1);
            prq.push(nn);
        }
        if(t!=r)
		{
            Node nn(o,t+1,r);
            prq.push(nn);
        }
    }
    cout<<ans;
    return 0;
}
2024/12/1 13:01
加载中...