题目给出一个矩形某几个坐标有数,然后给你一个给定的大小的矩形放置到里面,问如何才能让这个矩形里面的树最多...
这题数据比较弱弱才100,所以首先尝试了下暴力,竟然0ms过了,还是再用树状来一遍吧,在这种数据下树状体现不出优势啊,16ms过啊啊
二维树状数组其实就是更新操作时候多了一层而已,套两层循环直接就ok
就是在最后求解的时候需要用到容斥定理,套用一下小媛大牛的图吧

暴力枚举求解:
#include <stdio.h>
#include <string.h>
#define N 105
int map[N][N];
int main()
{
int n,w,h,sum,result,x,y;
while(scanf("%d",&n)!=EOF,n)
{
result=0;
memset(map,0,sizeof(map));
scanf("%d%d",&w,&h);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
scanf("%d%d",&x,&y);
for(int i=1;i<=w-x+1;i++)
for(int j=1;j<=h-y+1;j++)
{
sum=0;
for(int p=i;p<i+x;p++)
for(int q=j;q<j+y;q++)
sum+=map[p][q];
if(sum>result)
result=sum;
}
printf("%d\n",result);
}
}
二维树状数组
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#define MAX 105
int c[MAX][MAX];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y)
{
for(int i=x;i<MAX;i+=lowbit(i))
for(int j=y;j<MAX;j+=lowbit(j))
c[i][j]++;
}
int get(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+=c[i][j];
return sum;
}
int main()
{
int n,w,h,sum,result,x,y;
while(scanf("%d",&n)!=EOF,n)
{
result=0;
memset(c,0,sizeof(c));
scanf("%d%d",&w,&h);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
update(x,y);
}
scanf("%d%d",&x,&y);
for(int i=x;i<=w;i++)
for(int j=y;j<=h;j++)
{
sum=0;
sum=get(i,j)-get(i-x,j)-get(i,j-y)+get(i-x,j-y);
if(sum>result)
result=sum;
}
printf("%d\n",result);
}
}

浙公网安备 33010602011771号