POJ2029 二维线段树
Get Many Persimmon Trees
For example, in Figure 1, the entire field is a rectangular grid whose width and height are 10 and 8 respectively. Each asterisk (*) represents a place of a persimmon tree. If the specified width and height of the estate are 4 and 3 respectively, the area surrounded by the solid line contains the most persimmon trees. Similarly, if the estate's width is 6 and its height is 4, the area surrounded by the dashed line has the most, and if the estate's width and height are 3 and 4 respectively, the area surrounded by the dotted line contains the most persimmon trees. Note that the width and height cannot be swapped; the sizes 4 by 3 and 3 by 4 are different, as shown in Figure 1.
Figure 1: Examples of Rectangular Estates
Your task is to find the estate of a given size (width and height) that contains the largest number of persimmon trees.
Input
N
W H
x1 y1
x2 y2
...
xN yN
S T
N is the number of persimmon trees, which is a positive integer less than 500. W and H are the width and the height of the entire field respectively. You can assume that both W and H are positive integers whose values are less than 100. For each i (1 <= i <= N), xi and yi are coordinates of the i-th persimmon tree in the grid. Note that the origin of each coordinate is 1. You can assume that 1 <= xi <= W and 1 <= yi <= H, and no two trees have the same positions. But you should not assume that the persimmon trees are sorted in some order according to their positions. Lastly, S and T are positive integers of the width and height respectively of the estate given by the lord. You can also assume that 1 <= S <= W and 1 <= T <= H.
The end of the input is indicated by a line that solely contains a zero.
Output
Sample Input
16
10 8
2 2
2 5
2 7
3 3
3 8
4 2
4 5
4 8
6 4
6 7
7 5
7 8
8 1
8 4
9 6
10 3
4 3
8
6 4
1 2
2 1
2 4
3 4
4 2
5 3
6 1
6 2
3 2
0
Sample Output
4
3
————————————————————————————————————————————————————————————
主要是为了练习二维线段树。点修改,区域查询。
用二维线段树写这个题目真的很蠢,随便一个方法都比它好。
————————————————————————————————————————————————————————————
1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6
7 using namespace std;
8 const int maxn=101;
9 struct LIE
10 {
11 int ll,lr,sum;
12 };
13 struct HANG
14 {
15 int hl,hr;
16 LIE lie[maxn<<2];
17 }hang[maxn<<2];
18 int t;
19 int n,m,w,h,ans=0;
20 void readint(int &x)
21 {
22 char c=getchar();
23 int f=1;
24 for(;c<'0' || c>'9';c=getchar())if(c=='-')f=-f;
25 x=0;
26 for(;c<='9'&& c>='0';c=getchar())x=(x<<1)+(x<<3)+c-'0';
27 x*=f;
28 }
29 void writeint(int x)
30 {
31 char s[20];
32 int js=0;
33 if(!x)
34 {
35 s[0]='0';
36 js=1;
37 }
38 else
39 {
40 while(x)
41 {
42 s[js]=x%10+'0';
43 js++;x/=10;
44 }
45 }
46 js--;
47 while(js>=0)putchar(s[js--]);
48 putchar('\n');
49 }
50 void buil(int pre,int cur,int ll,int lr)
51 {
52 hang[pre].lie[cur].ll=ll;hang[pre].lie[cur].lr=lr;
53 hang[pre].lie[cur].sum=0;
54 if(ll==lr)return ;
55 int mid=(ll+lr)>>1;
56 buil(pre,cur<<1,ll,mid);
57 buil(pre,cur<<1|1,mid+1,lr);
58 }
59 void build(int cur,int hl,int hr,int ll,int lr)
60 {
61 hang[cur].hl=hl;hang[cur].hr=hr;
62 buil(cur,1,ll,lr);
63 if(hl==hr)return ;
64 int mid=(hl+hr)>>1;
65 build(cur<<1,hl,mid,ll,lr);
66 build(cur<<1|1,mid+1,hr,ll,lr);
67 }
68 void upda(int pre,int cur,int y)
69 {
70 hang[pre].lie[cur].sum++;
71 if(hang[pre].lie[cur].ll==hang[pre].lie[cur].lr)return;
72 int mid=(hang[pre].lie[cur].ll+hang[pre].lie[cur].lr)>>1;
73 if(y<=mid)upda(pre,cur<<1,y);
74 else upda(pre,cur<<1|1,y);
75 }
76 void update(int cur,int x,int y)
77 {
78 upda(cur,1,y);
79 if(hang[cur].hl==hang[cur].hr)return;
80 int mid=(hang[cur].hl+hang[cur].hr)>>1;
81 if(x<=mid)update(cur<<1,x,y);
82 else update(cur<<1|1,x,y);
83 }
84 int quer(int pre,int cur,int yl,int yr)
85 {
86 if(yl<=hang[pre].lie[cur].ll && hang[pre].lie[cur].lr<=yr)return hang[pre].lie[cur].sum;
87 int mid=(hang[pre].lie[cur].ll+hang[pre].lie[cur].lr)>>1;
88 int ans=0;
89 if(yl<=mid)ans+=quer(pre,cur<<1,yl,yr);
90 if(mid<yr)ans+=quer(pre,cur<<1|1,yl,yr);
91 return ans;
92 }
93 int query(int cur,int xl,int xr,int yl,int yr)
94 {
95 if(xl<=hang[cur].hl && hang[cur].hr<=xr)return quer(cur,1,yl,yr);
96 int mid=(hang[cur].hl+hang[cur].hr)>>1;
97 int ans=0;
98 if(xl<=mid)ans+=query(cur<<1,xl,xr,yl,yr);
99 if(xr>mid)ans+=query(cur<<1|1,xl,xr,yl,yr);
100 return ans;
101 }
102 int main()
103 {
104 readint(t);
105 while(t)
106 {
107 readint(n);readint(m);
108 build(1,1,n,1,m);
109 for(int x,y,i=0;i<t;i++)
110 {
111 readint(x);readint(y);
112 update(1,x,y);
113 }
114 readint(w);readint(h);
115 ans=0;
116 for(int i=1;i<=n-w+1;i++)
117 for(int j=1;j<=m-h+1;j++)
118 {
119 ans=max(ans,query(1,i,i+w-1,j,j+h-1));
120 }
121 writeint(ans);
122 readint(t);
123 }
124 return 0;
125 }
POJ2029 二维线段树的更多相关文章
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- HDU 1823 Luck and Love(二维线段树)
之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 4819 Mosaic --二维线段树(树套树)
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
- HDU 4819 Mosaic(13年长春现场 二维线段树)
HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...
随机推荐
- spring mvc 集成quartz
首先quartz配置文件 # Default Properties file for use by StdSchedulerFactory # to create a Quartz Scheduler ...
- IDEA git 切换分支
如图:打开DIEA , 在右下角找到Git分支 , 然后选择你要切换的分支 , 最后选择 Checkout
- 简单web页面第一步---表单
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncod ...
- 使用sqoop将mysql数据导入到hive中
首先准备工具环境:hadoop2.7+mysql5.7+sqoop1.4+hive3.1 准备一张数据库表: 接下来就可以操作了... 一.将MySQL数据导入到hdfs 首先我测试将zhaopin表 ...
- redis加锁的几种实现
redis加锁的几种实现 2017/09/21 1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在, ...
- 云计算之4---Cockpit
cockpit是一个简单可用的监控工具,你可以添加多个主机进行监控,上限是20台 .也可以使用cockpit来管理虚拟机/容器,也可以安装其他组件开启更多功能. 注意:cockpit没有告警功能,不适 ...
- Typecho 主题更换
Typecho 主题更换 前言 上一篇已经搭建自己的 Typecho 博客,博客搭建完成自带一个默认主题,不是很喜欢默认的主题,想换一个自己喜欢的主题,并在基础上进行修改. 本文就介绍下如何更换和自定 ...
- uni-app阻止事件向父级冒泡
在官网找到的就只有这个方法,但是我放在app项目里并不支持,所以就想到vue的阻止事件冒泡的方法,现在分享,免得大家踩坑 <view class="parent" @ ...
- 【详细】Python基础(一)
@ 目录 前言 1. Python环境的搭建 1.1 python解释器的安装 1.2 pycharm的安装 2. Python基础语法 2.1 基本语法 2.2 数据类型 2.3 标识符与关键字 2 ...
- 【C++】《C++ Primer 》第十六章
第十六章 模板与泛型编程 面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况. OOP能处理类型在程序允许之前都未知的情况. 泛型编程在编译时就可以获知类型. 一.定义模板 模板:模板是泛型编 ...