摘要:
HDU_4027 这个题目和HDU_3954有点像,由于开方这种运算我们没办法直接就将一段的和更新出来,但会发现即便是2^63能够被开方的次数也是很少的,因为一个数到1或者0之后我们就没必要再更新这个数了。所以,我们可以用num[]表示一个区间中不为0、1的整数的个数,如果我们要进行开方操作的区间内num[]的值不为0,我们就可以递归找到要更新的数并将其更新,同时更新路径上sum[]以及num[]的值。这样由于每个数被更新的次数不会超过10次,而每次找到一个需要更新的数的复杂度是O(logN),所以总共的更新操作的复杂度约是O(10*N*logN),是可以接受的。 此外,这个题目有个小tric
阅读全文
摘要:
HDU_3954 一开始始终在纠结要怎样维护max,因为不同等级的人每次加的经验是不一样的,这样如果只用一个max来维护最大值的话是很难办的。看了胡浩的出题报告之后恍然大悟,既然一个max来维护是很难办的,那不妨就将max变成K个,max[i]表示等级为i的人的经验的最大值,这样max[i]的增加就很好处理了。 至于如何处理一个人的升级问题,既然有了max[i],那么我们就知道每个等级上是否有人的经验达到了need[i+1],一旦有人达到就直接找到这个人,并将路径上的max[i]和max[i+1]的值更新一下即可。由于K比较小,每个人最多升级K次,而每次找一个人的复杂度是logN,所以升级操作
阅读全文
摘要:
URAL_1707 这个题目一开始感觉好麻烦的,不过多读了几遍之后终于把模型抽象出来了,如果把(si,ti)看成一个点的话,那么后面就是不断地在查询某个矩形范围内是否至少存在一个点,如果该范围内至少存在一个点那么xj就是1,否则xj就是0。 这让我联想到了POJ_2352数星星那个题,那个题是问一个点(x,y)的左边、下边以及左下方一共有多少个点(后面用sum(x,y)表示这个结果),而我们不难把Ural这个题目化归成那个题,如果矩形左下角是(x1,y1),右上角是(x2,y2)的话,那么最后结果就是sum(x2,y2)+sum(x1-1,y1-1)-sum(x1-1,y2)-sum(x2,y
阅读全文