hdu 4193 单调队列

2015-07-20 17:10:17 来源: 作者: 浏览: 3


题意是给你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
     ; }
    
   
  

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: