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;}