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) ...
随机推荐
- [Machine Learning] 单变量线性回归(Linear Regression with One Variable) - 线性回归-代价函数-梯度下降法-学习率
单变量线性回归(Linear Regression with One Variable) 什么是线性回归?线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方 ...
- 主从同步遇到 Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'时怎么解决
首先遇到这个是因为binlog位置索引处的问题,不要reset slave: reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会 ...
- 【分布式锁】Redis实现可重入的分布式锁
一.前言 之前写的一篇文章<细说分布式锁>介绍了分布式锁的三种实现方式,但是Redis实现分布式锁关于Lua脚本实现.自定义分布式锁注解以及需要注意的问题都没描述.本文就是详细说明如何利用 ...
- 解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)
错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL serve 错误1130:主机192.168.1.3& ...
- 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系
公众号Mac代码分割阅读链接 前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flin ...
- sql删除重复数据思路
总的思路就是先找出表中重复数据中的一条数据,插入临时表中,删除所有的重复数据,然后再将临时表中的数据插入表中.所以重点是如何找出重复数据中的一条数据,有三种情况 1.重复数据完全一样,使用distin ...
- SpringCloud | 通过电商业务场景让你彻底明白SpringCloud核心组件的底层原理
本文分为两个部分: Spring Cloud"全家桶"简单介绍. 通过实际电商业务场景,让你彻底明白Spring Cloud几个核心组件的底层原理. Spring Cloud介绍 ...
- Flutter 应用入门:路由管理
路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewContro ...
- 【Oracle】dump函数用法
Oracle dump函数的用法 一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全 ...
- 【ORA】ORA-01033,ORA-09968,ORA-01102
[oracle@oracle ~]$ imp xxxx/user file=/usr/local/src/666.dmp full=y buffer=40960000 Import: Release ...