poj 2029 Get Many Persimmon Trees 二维树状数组 大水
来源:互联网 发布:blink 大数据 编辑:程序博客网 时间:2024/05/27 01:33
/**** 大水题,据说暴搜都能过。 用的是二维树状数组,然后暴搜区间就行了。** 这道题犯了个超智障的连新手都不会犯的错误。被一个超低级bug搞死了。* 特地写个解题报告来鄙视下自己。。。* 当想用如下方式遍历区间的时候,明明知道把s, t赋值给i, j是多余的,就这么错了,以为没什么的* int a, b; a = b = 0;* for(int i = s; i + a <= h; a ++) {* for(int j = t; j + b <= w; b ++){* ...* }* }* 可是。。在a, b变的时候,i, j 却一直都是固定不变的!* 一般情况下* for(int i = s; i <= h; i ++)* for(int j = t; j <= w; j ++)* 在上层循环结束一遍后,j是会被重新赋值的! 这样就使j可以重新扫一遍了。* 而第一种情况改变的是a ++ 和 b ++ 。。就无限悲剧了!!!*/#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <algorithm>#define INF 0x7fffffff#define MAXS 105#define LL long longusing namespace std;int n, w, h, s, t;int c[MAXS][MAXS];int lowbit(int x) { return x & (-x);}int get_sum(int x, int y) { if(x == 0 || y == 0) return 0; int ret = 0; for(int i = y; i > 0; i -= lowbit(i)) { for(int j = x; j > 0; j -= lowbit(j)) ret += c[i][j]; } return ret;}void update(int x, int y) { for(int i = y; i <= h; i += lowbit(i)) { for(int j = x; j <= w; j += lowbit(j)){ c[i][j] ++; } }}void init(int x, int y) { for(int i = 1; i <= y; i ++) { for(int j = 1; j <= x; j ++) c[i][j] = 0; }}int main(){ while(scanf("%d", &n), n) { scanf("%d%d", &w, &h); init(w, h); int x, y, ans = 0; for(int i = 1; i <= n; i ++) { scanf("%d%d", &x, &y); update(x, y); } int s, t, cur; scanf("%d%d", &s, &t); for(int i = 0; i <= w - s; i ++) { for(int j = 0; j <= h - t; j ++) { cur = get_sum(i + s, j + t) - get_sum(i + s, j) - get_sum(i, j + t) + get_sum(i, j); if(cur > ans) ans = cur; } } printf("%d\n", ans); } return 0;}