
希望思路可以具体一点,或者帮敲一下,参考一下
//现在假定敌方军队有n支小队,假定第i支小队的位置在(i,f[i])。
//平安将军需要找到重点打击区域以进行火炮攻击,因此需要找到哪个区域军队小队数量最多。现在有m个查询,为了简化问题每个查询有一个矩形,你需要计算每一个矩形内有多少行有小队。
//Input
// 第一行包括一个整数T(T<=5)代表数据组数。
// 对于每组数据:
// 第一行包含两个整数 n,m(1<=n<=1e5,1<=m<=1e5),分别表示小队个数和查询次数。
// 第二行包含n个整数 f[i](0<=f[i]<=1e5)。
// 接下来m行,每行包含四个整数 x0,y0,x1,y1(1<=x0,x1<=n,0<=y0,y1<=1e5),代表该两点确定下的矩形。
//Output
// 对于每个查询,打印一个整数代表该区域内有多少行有小队。
//Sample Input
// 1
// 4 2
// 1 0 3 1
// 1 0 4 3
// 1 0 4 2
//Sample Output
// 3
// 2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX 100000
#define ROWS (MAX+1)
#define BYTES_PER_ROW ((MAX+1)/8+1)
#define TOTAL_BYTES ROWS*BYTES_PER_ROW
char *map;
int T,n,m,t,i,fi,y,x,x0,y0,x1,y1,r;
int main() {
map=(char *)malloc(TOTAL_BYTES);
if (NULL==map) {
printf("Can not malloc %d bytes!\n",TOTAL_BYTES);
return 1;
}
scanf("%d",&T);
for (t=0;t<T;t++) {
memset((void *)map,0,TOTAL_BYTES);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) {
scanf("%d",&fi);
map[fi*BYTES_PER_ROW+i/8]|=(1<<(i%8));
}
for (i=0;i<m;i++) {
scanf("%d%d%d%d%",&x0,&y0,&x1,&y1);
r=0;
for (y=y0;y<=y1;y++) {
for (x=x0;x<=x1;x++) {
if (map[y*BYTES_PER_ROW+x/8]&(1<<(x%8))) {
r++;
break;
}
}
}
printf("%d\n",r);
}
}
return 0;
}