poj 2029 Get Many Persimmon Trees(树状数组)

来源:互联网 发布:linux cgroups 编辑:程序博客网 时间:2024/06/03 21:33

题目链接:http://poj.org/problem?id=2029

题目大意:给定一个人h*w的矩阵,给定n个点表示该点上面有柿子树,求给定一个t*s的矩阵的最多的柿子树的个数

思路:简单的二维树状数组,加入一个点的时候更新树状数组

题目的范围最大为100,很明显就是要暴力枚举起点,然后求最大值即可

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN =510;struct node{int s,e;bool operator <(const node &tmp)const{if(s==tmp.s)return e<tmp.e;return s<tmp.s;}}nodes[MAXN];int n,m,k;int treenum[MAXN][MAXN];int lowbit(int x){    return x&(-x);}/*long long  getSum(int x){//一维    long long  sum = 0;    while(x){//将以x为根节点的数 相当于求其叶节点的和  但其非叶节点等于其两个子节点的和        sum += treenum[x];        x -= lowbit(x);    }    return sum;}*/long long  getSum(int x,int y){//二维   long long sum = 0;  for(int i=x;i>0;i-=lowbit(i))for(int j=y;j>0;j-=lowbit(j)){sum += treenum[i][j];}    return sum;}/*void add(int x , int val){//一维    while(x < MAXN){//相当于一个树  他将其自己以及他的父节点一路向上都加val         treenum[x] += val;         x += lowbit(x);    }}*/void add(int x ,int y, int val){//二维    for(int i=x;i<MAXN;i+=lowbit(i))for(int j=y;j<MAXN;j+=lowbit(j))        {treenum[i][j] += val;}}int solve(){int a,b;int ret=0,ans=0;scanf("%d%d",&a,&b);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){ret=getSum(i+a-1,j+b-1);ret-=getSum(i-1,j+b-1);ret-=getSum(i+a-1,j-1);ret+=getSum(i-1,j-1);ans=max(ans,ret);}return ans;}int main(){int a,b;while(~scanf("%d",&k)&&k){memset(treenum,0,sizeof treenum); scanf("%d%d",&n,&m); for(int i=0;i<k;i++){scanf("%d%d",&a,&b);add(a,b,1);}printf("%d\n",solve()); }    return 0;}


阅读全文
0 0
原创粉丝点击