Cornfields(poj2019)
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 6798 | Accepted: 3315 |
Description
FJ has, at great expense, surveyed his square farm of N x N hectares
(1 <= N <= 250). Each hectare has an integer elevation (0 <=
elevation <= 250) associated with it.
FJ will present your program with the elevations and a set of K (1
<= K <= 100,000) queries of the form "in this B x B submatrix,
what is the maximum and minimum elevation?". The integer B (1 <= B
<= N) is the size of one edge of the square cornfield and is a
constant for every inquiry. Help FJ find the best place to put his
cornfield.
Input
* Lines 2..N+1: Each line contains N space-separated integers. Line
2 represents row 1; line 3 represents row 2, etc. The first integer on
each line represents column 1; the second integer represents column 2;
etc.
* Lines N+2..N+K+1: Each line contains two space-separated integers
representing a query. The first integer is the top row of the query; the
second integer is the left column of the query. The integers are in the
range 1..N-B+1.
Output
Sample Input
5 3 1
5 1 2 6 3
1 3 5 2 7
7 2 4 6 1
9 9 8 6 5
0 6 9 3 9
1 2
Sample Output
5
思路:单调栈;
因为正方形的大小是固定的,然后我们先每列每个元素用单调队列维护最大最小值,然后在用维护的矩阵,在每行每个元素维护最大最小值
这样ama[i][j]就是以(i-b+1,j-b+1)为左上角,所有元素的最大值;同理ami[i][j]为最小。复杂度O(n*n);
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<deque>
7 #include<stack>
8 #include<math.h>
9 using namespace std;
10 typedef long long LL;
11 int ma[300][300];
12 int maxx[300][300];
13 int minn[300][300];
14 int que[300*2];
15 int ama[300][300];
16 int ami[300][300];
17 void get_maxx(int n,int k);
18 void get_minn(int n,int k);
19 int main(void)
20 {
21 int n,b,k;
22 int i,j;
23 while(scanf("%d %d %d",&n,&b,&k)!=EOF)
24 {
25 for(i = 1; i <= n; i++)
26 {
27 for(j = 1; j <= n; j++)
28 {
29 scanf("%d",&ma[i][j]);
30 }
31 }
32 get_minn(n,b);
33 get_maxx(n,b);
34 while(k--)
35 {
36 int x;
37 int y;
38 scanf("%d %d",&x,&y);
39 x+=b-1;
40 y+=b-1;
41 printf("%d\n",ama[x][y]-ami[x][y]);
42 }
43 }
44 return 0;
45 }
46 void get_maxx(int n,int k)
47 {
48 int i,j;
49 for(j = 1; j <= n; j++)
50 {
51 int head = 1;
52 int rail = 0;
53 for(i = 1; i <= n; i++)
54 {
55 if(head > rail)
56 {
57 que[++rail] = i;
58 }
59 else
60 {
61 int id = que[rail];
62 while(ma[id][j] <= ma[i][j])
63 {
64 rail--;
65 if(rail < head)
66 break;
67 id = que[rail];
68 }
69 que[++rail] = i;
70 }
71 int ic = que[head];
72 while(ic < max(0,i-k)+1)
73 {
74 head++;
75 ic = que[head];
76 }
77 maxx[i][j] = ma[que[head]][j];
78 }
79 }
80 for(i = 1; i <= n; i++)
81 {
82 int head = 1;
83 int rail = 0;
84 for(j = 1; j <= n; j++)
85 {
86 if(head > rail)
87 {
88 que[++rail] = j;
89 }
90 else
91 {
92 int id = que[rail];
93 while(maxx[i][id] <= maxx[i][j])
94 {
95 rail--;
96 if(rail < head)
97 break;
98 id = que[rail];
99 }
100 que[++rail] = j;
101 }
102 int ic = que[head];
103 while(ic < max(0,j-k)+1)
104 {
105 head++;
106 ic = que[head];
107 }
108 ama[i][j] = maxx[i][que[head]];
109 }
110 }
111 }
112 void get_minn(int n,int k)
113 {
114 int i,j;
115 for(j = 1; j <= n; j++)
116 {
117 int head = 1;
118 int rail = 0;
119 for(i = 1; i <= n; i++)
120 {
121 if(head > rail)
122 {
123 que[++rail] = i;
124 }
125 else
126 {
127 int id = que[rail];
128 while(ma[id][j] >= ma[i][j])
129 {
130 rail--;
131 if(rail < head)
132 break;
133 id = que[rail];
134 }
135 que[++rail] = i;
136 }
137 int ic = que[head];
138 while(ic < max(0,i-k)+1)
139 {
140 head++;
141 ic = que[head];
142 }
143 minn[i][j] = ma[que[head]][j];
144 }
145 }
146 for(i = 1; i <= n; i++)
147 {
148 int head = 1;
149 int rail = 0;
150 for(j = 1; j <= n; j++)
151 {
152 if(head > rail)
153 {
154 que[++rail] = j;
155 }
156 else
157 {
158 int id = que[rail];
159 while(minn[i][id] >= minn[i][j])
160 {
161 rail--;
162 if(rail < head)
163 break;
164 id = que[rail];
165 }
166 que[++rail] = j;
167 }
168 int ic = que[head];
169 while(ic < max(0,j-k)+1)
170 {
171 head++;
172 ic = que[head];
173 }
174 ami[i][j] = minn[i][que[head]];
175 }
176 }
177 }
Cornfields(poj2019)的更多相关文章
- Cornfields poj2019 二维RMQ
Cornfields Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submit S ...
- [poj2019]Cornfields(二维RMQ)
题意:给你一个n*n的矩阵,让你从中圈定一个小矩阵,其大小为b*b,有q个询问,每次询问告诉你小矩阵的左上角,求小矩阵内的最大值和最小值的差. 解题关键:二维st表模板题. 预处理复杂度:$O({n^ ...
- [POJ 2019] Cornfields
Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5516 Accepted: 2714 Descri ...
- POJ 2019 Cornfields [二维RMQ]
题目传送门 Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7963 Accepted: 3822 ...
- POJ 2019 Cornfields (二维RMQ)
Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4911 Accepted: 2392 Descri ...
- poj2019 二维RMQ裸题
Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions:8623 Accepted: 4100 Descrip ...
- POJ 2019 Cornfields(二维RMQ)
相比以前的RMQ不同的是,这是一个二维的ST算法 #include<iostream> #include<cstring> #include<cstdio> #in ...
- poj2019 二维RMQ模板题
和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> # ...
- Cornfields POJ - 2019(二维RMQ板题)
就是求子矩阵中最大值与最小值的差... 板子都套不对的人.... #include <iostream> #include <cstdio> #include <sstr ...
随机推荐
- SPI详解2
串行外设接口 (SPI) 总线是一种运行于全双工模式下的同步串行数据链路.用于在单个主节点和一个或多个从节点之间交换数据. SPI 总线实施简单,仅使用四条数据信号线和控制信号线(请参见图 1). 图 ...
- PL\SQL和PL/SQL Developer 12安装与配置
安装: (1)在已有安装包的情况下,直接将安装包解压到文件夹下,注意不要解压缩到c:\programs Files(x86)的文件夹下,不能解压缩到有中文文件夹命名的文件夹下面 (2)没有安装包的情况 ...
- R2CNN模型——用于文本目标检测的模型
引言 R2CNN全称Rotational Region CNN,是一个针对斜框文本检测的CNN模型,原型是Faster R-CNN,paper中的模型主要针对文本检测,调整后也可用于航拍图像的检测中去 ...
- Hadoop入门 概念
Hadoop是分布式系统基础架构,通常指Hadoop生态圈 主要解决 1.海量数据的存储 2.海量数据的分析计算 优势 高可靠性:Hadoop底层维护多个数据副本,即使Hadoop某个计算元素或存储出 ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- Sharding-JDBC 实现垂直分库水平分表
1.需求分析
- Sharding-JDBC 实现水平分表
1.搭建环 (1) 技术: SpringBoot2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 连接池(2)创建 SpringBoot 工程
- openwrt编译ipk包提示缺少feeds.mk文件
问题具体表现如下 这个问题困扰了我两个多星期,总算解决了.解决方案如下: 首先,先应该把配置菜单调好. 我的硬件是7620a,要编译的ipk包为helloworld,所以应该使用 make menuc ...
- LeetCode1579题——圆圈中最后剩下的数字
1.题目描述:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删 ...
- listView 多布局
最近在开发项目中遇到了实现类似淘宝首页的需求,使用listView可以解决,在此记录一下. 实现步骤: 重写 getViewTypeCount() – 返回你有多少个不同的布局 重写 getItemV ...