题目链接:
http://poj.org/problem?id=2029
题意:
N个星,在W*H的网格中,下面给出N个星的位置,给出S,T,要找出S*T大小的矩形,使得星星最多
题解:
http://blog.csdn.net/zxy_snow/article/details/6260895
二维树状数组和一维差不多,维护的是两个方向x,y。一块面积?
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 500+10;
int bit[maxn][maxn];
void add(int x,int y,int v){
for(int i=x; i<maxn; i+=i&-i)
for(int j=y; j<maxn; j+=j&-j)
bit[i][j] += v;
}
int sum(int x,int y){
int res = 0;
for(int i=x; i>0; i-=i&-i)
for(int j=y; j>0; j-=j&-j)
res += bit[i][j];
return res;
}
int main(){
int n;
while(cin>>n && n){
MS(bit);
int W,H; cin>>W>>H;
for(int i=0; i<n; i++){
int x,y; cin>>x>>y;
add(x,y,1);
}
int s,t; cin>>s>>t;
int ans = 0;
for(int w=s; w<=W; w++)
for(int h=t; h<=H; h++){
int tmp = sum(w,h)-sum(w-s,h)-sum(w,h-t)+sum(w-s,h-t);
if(tmp > ans) ans = tmp;
}
cout << ans << endl;
}
return 0;
}