【IOI2001】【poj1195】Mobile phones(二维树状数组)
一维树状数组维护的是区间和,最后统计的是1~x数的和,而二维树状数组维护的是一个面的和,最后统计的是 (1,1)~(x,y)区域内数的和 (x ,y)所维护的面大小由x,y共同决定,x决定高度,y决定宽度 add和query操作的两层循环结合二分图理解比较直观 如何分呢?首先,我们按照X坐标,把整个表格分成部分,并对每个部分按照X坐标继续二分下去,同时,我们将分得的每个部分再按Y坐标进行二分,并记下最终分得的每个部分的移动电话总数。 “多重二分”的结果,实际上类似于一维情况下二分的结果,也是形成一种“树”状的结构,只不过由于是多重二分,所以这棵“树”的每个节点仍然是一棵“树”。 在这棵“二分树”上进行“改动”操作,只要按照X坐标从“根”到“叶”,处理路径上每个节点,由于这些节点也是树,所以要按照Y坐标从“根”到“叶”,依次修改路径上的每个节点的数据。这样,处理每个节点的时间复杂度为O(log 2 n),每次修改需要处理的节点数为log 2 n,所以每次“改动”操作的时间复杂度为O(log 2 n* log 2 n)。 在“二分树”上从“根”到“叶”查找X,如果某步是向右子树走,则须处理相应的左子树的根节点,直到找到X,再处理此叶节点。 以X坐标为标准的“二分树”上的每个节点同时也是一棵以Y坐标为标准的“二分树”,对其处理的方法为:从“根”到“叶”查找Y,如果某步是向右子树走