bupt 201 树状数组

 

北邮2011-7-16邀请赛G题,(bupt 201)

http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=201

 

题意:有一个数组a[],有一个对应数组c[],c[]中存0或1,定义l(i,j)==min(a|  i…j);求ans为其中所有l(i,j)<k的对数。而如果c[i]和c[j]不相等的话l(i,j)为无穷大。

两种操作:1 输出ans

          0 i 反向c[i]的值

最后思路:先求出i位置左和右最靠近它的而且a值小于k的位置,然后维护每个位置前后的0,1个数(当然了,只需要维护一个值就可以了),然后每次更新只需要加减与这个元素相关的值就可以了,这值就可以O(1)*O(lgn)算出来了。。。

无语启发思路啊。。。

注意要用longlong。。。

 

要基础扎实啊,也要多讨论啊。。。

 

你可能感兴趣的:(bupt 201 树状数组)