【练习题】数据离散化+二维前缀和
题目大意输入输出样例解释重要提示
思路代码时间复杂度
题目大意
mtc是一个很优秀的同学,他学习认真,经常刷题。这天,他正好学习到了数据离散化与二位前缀和的相关概念,并给大家进行科普. 数据的离散化:有些教据本身很大,自身无法作为数组的下标保存对应的属性,如果这时只是需要这堆数据的相对属性,那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。百度百科 例如:设有4个数: 1234567、123456789、12345678、123456 排序:123456
int mid = l + r >> 1;
if(idx[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1; // 映射下标从1开始,便于计算前缀和
}
// 将纵坐标离散化,映射到某个下标
int findy(int x){
int l = 0, r = idy.size() - 1;
while(l
cin >> n >> m;
// n个点
for(int i = 0; i x, y});
idx.push_back(x);
idy.push_back(y);
}
// 分别对横坐标、纵坐标排序、去重
sort(idx.begin(), idx.end());
idx.erase(unique(idx.begin(),idx.end()), idx.end());
sort(idy.begin(), idy.end());
idy.erase(unique(idy.begin(),idy.end()), idy.end());
// 处理原始点,映射下标
for(int i = 0; i
s[i][j] = a[i][j] + s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1];
}
// 处理询问
for(int i = 0; i |