【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];
对于作者转载文章,欢迎继续转载。
对于作者原创文章,请注明出处之后转载。