【P2629】好消息,坏消息(前缀和+单调队列优化DP)

一激动一颓就会忘了总结。。。

前面的大黄题就不总结了。

这个题我只想说一声艹,一开始的思路就是正确的,然后计算的时候有了一个瑕疵,不过很快也就改过来了。然后却一直连样例都过不了。仔仔细细看了老半天,经过了半个小时之后,忍不住瞄了一眼题解,突然觉悟到自己的前缀和打错了。。。。。。。

附前缀和计算方法:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register
#define wc 0.0000000001
using namespace std;
int head,tail,n,m,a[2000001],d,q[3000001],ans,cnt,b[10000001],s[2000001];
int main()
{
    cin>>n;
    for(re int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i+n]=a[i];
    }
    for(re int i=1;i<=2*n;i++)
    s[i]=s[i-1]+a[i];
    head=1;tail=0;
    for(re int i=1;i<=2*n;i++)
    {
        while(head<=tail&&s[i]<=s[q[tail]])
        tail--;
        q[++tail]=i;
        while(head<=tail&&i-q[head]>n)
        head++;    
        if(i>n&&s[q[head]]-s[i-n-1]<0)
        b[i]=1;
        
    }
    
    for(re int i=n+1;i<=n*2;i++)
    {
        if(!b[i])
        ans++;
    }
    cout<<ans;
}
s[i]-s[j-1]为i到j的前缀和,而不是s[i]-s[j];
原文地址:https://www.cnblogs.com/victorique/p/8426846.html