北邮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。。。
要基础扎实啊,也要多讨论啊。。。