【gcj 2008 1c】长数字串运算计数,递增子序列计数

第二题  长数字串运算计数

长度为D的数字串(D<=40)在其中加上加号、减号或者不加符号(不加符号则相邻数字连接为一个数,让结果至少能被2 3 5 7之一整除,问有多少种方法。

两次DP 

第一次用于区间[l, r] 对应的大整数对小整数 求余(见数字分类下的某篇文章)。 第二次是区间分解dp。

code: https://github.com/stevenberge/acm/blob/master/gcj/20081c2.cc


第三题 递增子序列计数

 给定一个数列,求严格的单增子序列的个数。给定数列长度有50w...

小数据: dp

cnt[i] = E(cnt[j<i], a[j]<a[i]), 时间复杂度O(n^2)

大数据:线段树/树状数组做区间查询Sum+数组元素离散化

for i=0 to n-1: 
      tree[b[i]] +=sum{  tree[b[j]], b[0]<=b[j]<b[i] }  //查询[0,i-1] 区间的sum
时间复杂度O(nlgn)
code:
https://github.com/stevenberge/acm/blob/master/gcj/20081c3.treeArr.cc
https://github.com/stevenberge/acm/blob/master/gcj/20081c3.cc

你可能感兴趣的:(【gcj 2008 1c】长数字串运算计数,递增子序列计数)