单调队列85分求助
查看原帖
单调队列85分求助
169594
Heart_Of_Iron_4楼主2022/3/4 22:50

RT

#include<bits/stdc++.h>
using namespace std;
int a[1000100],n,m;
int h[2000100],hd,lt=0,mi[2000100],ans;
int main()
{
    scanf("%d",&n);
    m=n;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        a[i]=a[i-1]+a[i];
    }
    for(int i=n+1;i<=2*n;++i)a[i]=a[i-1]+a[i-n]-a[i-n-1];
    n=n*2;
    /*for(int i=1;i<=n;++i)
    {
        printf("%d ",a[i]);
    }
    puts("");*/
    h[0]=INT_MAX;
    for(int i=1;i<m;++i)
    {
        h[++lt]=i;
        while(lt>hd+1&&a[h[lt]]<a[h[lt-1]])
        {
            h[lt-1]=h[lt];
            lt--;
        }
    }
    /*for(int i=hd+1;i<=lt;++i)
        {
            printf("%d ",a[h[i]]);
        }
        puts("");*/
    hd=0,lt=0;
    for(int i=1;i<m;++i)
    {
        h[++lt]=i;
        while(lt>hd+1&&a[h[lt]]<a[h[lt-1]])
        {
            h[lt-1]=h[lt];
            lt--;
        }
    }
    for(int i=m;i<=n;++i)
    {
        if(h[hd+1]<i-m+1&&h[hd+1]!=0)
        {
            hd++;
            h[hd-1]=INT_MAX;
        }
        h[++lt]=i;
        while(lt>hd+1&&a[h[lt]]<a[h[lt-1]])
        {
            h[lt-1]=h[lt];
            lt--;
        }
        mi[i]=a[h[hd+1]];
        /*for(int i=hd+1;i<=lt;++i)
        {
            printf("%d ",a[h[i]]);
        }
        puts("");*/
    }
    //for(int i=1;i<=n/2;++i)printf("%d ",mi[i+n/2-1]);
    //puts("miOK");
    for(int i=1;i<=n/2;++i)
    {
        if(mi[i+n/2-1]-a[i-1]>=0)ans++;
        //printf("%d ",a[i-1]);
    }
    //puts("aOK");
    printf("%d",ans);
    return 0;
}
2022/3/4 22:50
加载中...