1 条题解

  • 1
    @ 2024-11-7 16:56:03

    这道题一眼区间 (这不是很明显吗?)

    可以定义一个 bb 数组储存 aa 数组的前缀和,那么 aa 数组第 ii 项至第 jj 项的和 = bjbj1b_j - b_{j-1}

    不过考虑到数据范围 1n4×1061 \le n \le 4 \times 10^6,所以利用二分优化。

    上代码!

    #include<iostream>
    using namespace std;
    const int N=4000010;
    int a[N];
    long long b[N];
    int L,R,sum;
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		b[i]=b[i-1]+a[i];//b数组存a数组的前缀和
    	}
    	for(int i=1;i<=n;i++)//优化后只需枚举i的值
    	{
        //二分确定最优的j
    		int l=i,r=n,mid;
    		while(l<=r)
    		{
    			mid=(l+r)>>1;
    			if(b[mid]-b[i-1]>m) r=mid-1;
    			else l=mid+1;
    		}
    		int t=b[r]-b[i-1];
    		if(t>sum)
    		{
          //更新sum的值
    			sum=t;
    			L=i;
    			R=r;
    		}
    	}
    	cout<<L<<' '<<R<<' '<<sum<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    2304
    时间
    1000ms
    内存
    125MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者