我想解决一个给出n个点的(整数)坐标的问题(n <= 10 ^ 5) 并询问q个查询(q <= 10 ^ 4)。在每个查询中,它给出了两个其他点的(积分)坐标,我们需要回答这两个点创建的矩形中有多少个n点。
(编辑)坐标也很大(x,y <= 10 ^ 9)(/ edit)
我创建了一个四叉树然后使用此函数来获得答案,但是我超出了时间限制(时间限制= 2秒)。这种方法是否太慢或者我做错了什么?
int sum(int left, int right, int down, int up, int i=1, int begx=0, int endx=1e9, int begy=0, int endy=1e9)
{
if (!i || left>right || down>up) return 0;
if (left==begx && right==endx && down==begy && up==endy) return num[i];
int midx = (begx+endx)/2, midy = (begy+endy)/2;
return sum(left,min(midx,right),down,min(midy,up),child[i][0],begx,midx,begy,midy)
+ sum(left,min(midx,right),max(midy+1,down),up,child[i][1],begx,midx,midy+1,endy)
+ sum(max(midx+1,left),right,down,min(midy,up),child[i][2],midx+1,endx,begy,midy)
+ sum(max(midx+1,left),right,max(midy+1,down),up,child[i][3],midx+1,endx,midy+1,endy);
}
如果我评论此功能(并且不回答查询,只需将点添加到四叉树),我的执行时间约为0.2秒。
数组num
存储节点的总和,child
存储每个节点的四个子节点的索引。节点0是虚拟的。子项中矩形的分区如下所示:
___
|1 3|
|0 2|
---