poj 2029 Get Many Persimmon Trees
2015-08-13 22:41
411 查看
题意:美丽的夜晚有许多的星星,每个星星都有自己的坐标,你有一个长宽确定的窗户,问如何安置窗户可以看到最多的星星的数量,
思路:之前只学了一维的树状数组,想这个题的时候竟然自己yy出了二维的用法,这里我将每一竖行用树状数组储存星星的个数,如a[i][j]代表第i列前1~j行的星星数量,形成一个二维的树状数组,计算最大的星星数量时,枚举窗户位置,利用树状数组的查询功能快速计算出可以看到星星的数量,
思路:之前只学了一维的树状数组,想这个题的时候竟然自己yy出了二维的用法,这里我将每一竖行用树状数组储存星星的个数,如a[i][j]代表第i列前1~j行的星星数量,形成一个二维的树状数组,计算最大的星星数量时,枚举窗户位置,利用树状数组的查询功能快速计算出可以看到星星的数量,
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[120][120]; int n,w,h,s,t; int low(int x) { return x&(-x); } int que(int x,int y) { int tmp=y; int sum=0; while(tmp>0) { sum+=a[x][tmp]; tmp-=low(tmp); } return sum; } int add(int x,int y) { int tmp=y; while(tmp<110) { a[x][tmp]+=1; tmp+=low(tmp); } return 1; } int main() { freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF&&n) { memset(a,0,sizeof(a)); scanf("%d%d",&w,&h); int x,y; for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); add(x,y); } scanf("%d%d",&s,&t); int ans=0,sum=0; for(int i=1;i+s-1<=w;i++) { for(int j=1;j+t-1<=h;j++) { sum=0; for(int k=i;k<=i+s-1;k++) { sum+=(que(k,j+t-1)-que(k,j-1)); } ans=max(ans,sum); } } printf("%d\n",ans); } }
相关文章推荐
- 虚函数的使用
- JAVA大整数[小结]
- 1、为什么每个viewDidLoad方法中都要使用[super viewDidLoad] ?
- JackSon 数据之间的转换 java
- 随笔
- 什么是 Event Loop
- [拓展]杭电1003(最大子数组问题)
- P命名空间给Bean属性注值
- java执行命令行
- common lisp 中宏定义时不能使用#'? 形式的函数作为参数
- zoj_1002
- Discuz论坛 创始人/超级管理员密码忘记解决办法!
- 【MySql】使用记录<七>
- HDU 5389 Zero Escape (MUT#8 dp优化)
- justfun
- 华为训练题:高级——火车进站(栈与队列,递归)
- C++调用Lua的性能测试
- 3.建造者模式(设计模式笔记)
- Innodb/MyISAM在自增/UUID主键下的性能与索引空间比较
- Linux用户和用户组管理-用户管理命令passwd/usermod/chage/userdel/su***用户组管理命令