这题一眼看去就是更新区间查找点,典型的树状数组解法,但是如果用三维树状数组的话,会遇到一个难题,那就是怎么分割?
我们看简单的问题开始,对于一维的情况,将区间(a,b)进行更新,那么就在a处加v,b+1处减v即可。
对于二维的情况,那就麻烦一点,将区域(x1,y1)到(x2,y2)进行更新,那么就在(x1,y1)处加v,在(x2+1,y1)和(x1,y2+1)处减v,在(x2+1,y2+1)处加v即可。
那么三维的呢?经过画图,我得到了结论,那就是(x1,y1,z1)加v,和(x1,y1,z1)相邻奇数长度的点减v,这些点有(x2+1,y1,z1)、(x1,y2+1,z1)、(x1,y1,z2+1)还有(x2+1,y2+1,z2+1),剩下的就是加v了。
把三个维度不同的树状数组的情况和在一起,源点P加v和P相邻奇数位置的减v,偶数位置的加v,这样就可以快速地记下来全部的切割情况了。
我的代码:
总结:每次做题后要反思,不能做一题过一题,宁可花时间想怎么优化代码,毕竟这个对自己好处更大。做题不贵多,而贵精。