1. 程式人生 > >POJ-2029 Get Many Persimmon Trees---二維樹狀數組+枚舉

POJ-2029 Get Many Persimmon Trees---二維樹狀數組+枚舉

man for https con color name 樹狀數組 二維 tps

題目鏈接:

https://vjudge.net/problem/POJ-2029

題目大意:

有N棵樹在一個n*m的田裏,給出每顆樹的坐標

用一個s*t的矩形去圍,最多能圍幾棵樹 思路: 用二維樹狀數組求區域和,也可以直接用二維前綴和求解
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<map>
 6 #include<set>
 7 #include<cmath>
 8 #include<algorithm>
 9
#define lowbot(i) (i&(-i)) 10 using namespace std; 11 typedef long long ll; 12 const int maxn = 500 + 10; 13 int n, m, T, k, cases; 14 int tree[maxn][maxn]; 15 void add(int x, int y, int d) 16 { 17 for(int i = x; i <= n; i += lowbot(i)) 18 { 19 for(int j = y; j <= m; j += lowbot(j))
20 { 21 tree[i][j] += d; 22 } 23 } 24 } 25 int sum(int x, int y) 26 { 27 int ans = 0; 28 for(int i = x; i > 0; i -= lowbot(i)) 29 { 30 for(int j = y; j > 0; j -= lowbot(j)) 31 { 32 ans += tree[i][j]; 33 } 34 } 35 return
ans; 36 } 37 int Sum(int x1, int y1, int x2, int y2) 38 { 39 return sum(x2, y2) + sum(x1 - 1, y1 - 1) - sum(x1 - 1, y2) - sum(x2, y1 - 1); 40 } 41 int main() 42 { 43 while(cin >> k && k) 44 { 45 int x, y, s, t; 46 memset(tree, 0, sizeof(tree)); 47 cin >> n >> m; 48 while(k--) 49 { 50 scanf("%d%d", &x, &y); 51 add(x, y, 1); 52 } 53 cin >> s >> t; 54 int ans = 0; 55 for(int i = 1; i + s - 1 <= n; i++) 56 { 57 for(int j = 1; j + t - 1 <= m; j++) 58 { 59 int tot = Sum(i, j, i + s - 1, j + t - 1); 60 ans = max(ans, tot); 61 } 62 } 63 cout<<ans<<endl; 64 } 65 return 0; 66 }

POJ-2029 Get Many Persimmon Trees---二維樹狀數組+枚舉