2 solutions

  • 1
    @ 2024-2-6 19:31:47
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define N 200017 
    #define ll long long
    using namespace std;
    
    int n;ll a[N],sum[N]; 
    
    int binary_search(int l,int r){//找到第一个比 avg 大的 pos 
    	ll avg = (sum[r]-sum[l-1])/2;
    	int st = l-1,opt = -1;
    	while(l <= r){
    		int mid = (l+r)>>1;
    		if(mid == opt)break;opt = mid;
    		if(sum[mid]-sum[st] >= avg)r = mid;
    		else l = mid+1;
    	}
    	if(sum[min(l,r)]-sum[st] >= avg)return min(l,r);
    	else return max(l,r);
    }
    
    int main()
    {
    	cin >> n;
    	for(int i = 1;i <= n;i += 1){
    		cin >> a[i];
    		sum[i] = sum[i-1] + a[i];
    	}
    	int q,l,r;cin >> q;
    	for(int i = 1;i <= q;i += 1){
    		cin >> l >> r;
    		int p = binary_search(l,r);
    		ll res = 0;
    		if(p-1 >= l)res = max(res,(sum[p-1]-sum[l-1])*(sum[r]-sum[p-1]));
    		if(p < r)res = max(res,(sum[p]-sum[l-1])*(sum[r]-sum[p]));
    		cout << res << '\n';
    	}
    	return 0;
    }
    
    
    • 0
      @ 2024-2-6 18:28:53

      Solution

      sum=a+bsum = a+b,要想使得aba*b尽可能大,则a,ba,b应该尽可能靠近

      avg=liri2avg = \frac{\sum_{li}^{ri}}{2},那么 lpai\sum_{l}^{p} a_i 应该尽量靠近avgavg

      我们设从pospos开始第一次 avg \geq avg

      由于\sum具有单调性,不妨采用二分查找pospos

      注意:

      1.第一个比avgavg小的和第一个比avgavg大的都有可能是答案

      2.注意pp不要超过[l,r][l,r]的限制

      • 1

      Information

      ID
      308
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      6
      Tags
      (None)
      # Submissions
      94
      Accepted
      26
      Uploaded By