对于平均数相关的常见处理办法

如果要求子区间中全部数字的平均数大于100,可以先将区间中全部数字都减100,然后再判断区间和是否大于0,这样就可以避免平均数的值和区间长度相关的问题。

例题:

AcWing 4487. 最长连续子序列

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int a[1000020];
LL psum[1000020];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]-=100;
        psum[i]=psum[i-1]+a[i];
    }
    vector<int> down;
    down.push_back(0);
    int res=0;

    for(int i=1;i<=n;i++)
    {
        int l=0,r=down.size()-1;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(psum[down[mid]]<psum[i]) r=mid;
            else l=mid+1;
        }
        if(psum[down[l]]<psum[i]) res=max(res,i-down[l]);
        if(psum[i]<psum[down.back()]) down.push_back(i);
    }
    cout<<res<<endl;
}
View Code

 

posted @ 2022-06-26 19:33  80k  阅读(52)  评论(0)    收藏  举报