思路: 简单的二维树状数组
分析:
1 题目给定一个人h*w的矩阵,给定n个点表示该点上面有柿子树,求给定一个t*s的矩阵的最多的柿子树的个数
2 简单的二维树状数组,加入一个点的时候更新树状数组
3 题目的范围最大为100,很明显就是要暴力枚举起点,然后求最大值即可
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 110; int n , w , h; int treeNum[MAXN][MAXN]; int lowbit(int x){ return x&(-x); } void add(int x , int y , int val){ for(int i = x ; i < MAXN ; i += lowbit(i)) for(int j = y ; j < MAXN ; j += lowbit(j)) treeNum[i][j] += val; } int getSum(int x , int y){ int sum = 0; for(int i = x ; i > 0 ; i -= lowbit(i)) for(int j = y ; j > 0 ; j -= lowbit(j)) sum += treeNum[i][j]; return sum; } int solve(int x , int y){ int ans = 0; for(int i = 1 ; i <= h ; i++){ for(int j = 1 ; j <= w ; j++){ int sum = getSum(i+x-1 , j+y-1); sum -= getSum(i-1 , j+y-1); sum -= getSum(i+x-1 , j-1); sum += getSum(i-1 , j-1); ans = max(ans , sum); } } return ans; } int main(){ int x , y; while(scanf("%d" , &n) && n){ scanf("%d%d" , &w , &h); memset(treeNum , 0 , sizeof(treeNum)); for(int i = 0 ; i < n ; i++){ scanf("%d%d" , &x , &y); add(y , x , 1); } scanf("%d%d" , &x , &y); printf("%d\n" , solve(y , x)); } return 0; }
时间: 2024-11-04 00:56:24