hdu6333 给出n和m,求C(n,0)+C(n,1)+...+C(n,m)的值。
把结果定义为S(n,m),可以得到S(n,m) = S(n-1,m) + S(n-1,m-1),由此就有S(n,m) = S(n,m-1) + C(n,m) = 2*S(n-1,m) - C(n,m)。
也就是说根据S(n,m)我们可以在O(1)的时间里求出S(n-1,m),S(n,m-1),S(n+1,m),S(n,m+1),于是就可以用莫队算法来做了。
莫队算法解决的问题就是对于n个数的数列,有若干(l,r)的询问,查询区间的某些性质。如果对于(l,r),可以O(1)内转移到(l,r-1),(l,r+1),(l+1,r),(l-1,r),就可以离线地处理这些询问,通过适当地改变运算顺序,在更优的时间复杂度内完成所有查询。
莫队算法首先将序列分成sqrt(n)个块,对查询的区间排序的时候,如果左端点在同一块里面就按右端点升序排序,否则就按左端点排序。这样按顺序处理的区间的时候可以使得转换的次数相对较小。以及此题里转移并不是简单的加减,需要使用上面的两个式子。
#include
#include
#include
#include
#include