題意是給你n個數 組成的環 求以一個數開頭 的數列所有前綴都為非負數的數列的個數:
思路: 先擴展成2*n的數列 然後求出sum【i】表示前i項的和 對每個i>.=n結尾的數列 只要單調隊列裡的最小值大於等於sum【i-n】就滿足情況(想想為什麼) 對於單調隊列 只要維護長度大於等於n 遞增的就行;
#include#include #include using namespace std; int num[2001000],sum[2001000],id[2001000]; int main() { int n,i,j; while(~scanf("%d",&n),n) { for(i=1;i<=n;i++) { scanf("%d",&num[i]); num[i+n]=num[i]; } sum[0]=0; for(i=1;i<=n+n;i++) { sum[i]=sum[i-1]+num[i]; } int front=0,top=0; int t=0; for(i=1;i<n+n;i++) { while(front<top&&sum[i]<sum[id[top]]) top--; id[++top]=i; if(i>=n&&sum[id[front+1]]>=sum[i-n]) t++; while(id[top]-id[front+1]>=n) front++; } printf("%d\n",t); } return 0; }