Cornfields
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 6798   Accepted: 3315

Description

FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, he's looking to build the cornfield on the flattest piece of land he can find.


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

* Line 1: Three space-separated integers: N, B, and K.



* 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

* Lines 1..K: A single integer per line representing the difference between the max and the min in each query.

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)的更多相关文章

  1. Cornfields poj2019 二维RMQ

    Cornfields Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit S ...

  2. [poj2019]Cornfields(二维RMQ)

    题意:给你一个n*n的矩阵,让你从中圈定一个小矩阵,其大小为b*b,有q个询问,每次询问告诉你小矩阵的左上角,求小矩阵内的最大值和最小值的差. 解题关键:二维st表模板题. 预处理复杂度:$O({n^ ...

  3. [POJ 2019] Cornfields

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5516   Accepted: 2714 Descri ...

  4. POJ 2019 Cornfields [二维RMQ]

    题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 ...

  5. POJ 2019 Cornfields (二维RMQ)

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4911   Accepted: 2392 Descri ...

  6. poj2019 二维RMQ裸题

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:8623   Accepted: 4100 Descrip ...

  7. POJ 2019 Cornfields(二维RMQ)

    相比以前的RMQ不同的是,这是一个二维的ST算法 #include<iostream> #include<cstring> #include<cstdio> #in ...

  8. poj2019 二维RMQ模板题

    和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> # ...

  9. Cornfields POJ - 2019(二维RMQ板题)

    就是求子矩阵中最大值与最小值的差... 板子都套不对的人.... #include <iostream> #include <cstdio> #include <sstr ...

随机推荐

  1. Perl if条件判断

    Perl 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 条件判断常用: True         #布尔值 not True   #布尔值 ! True    ...

  2. n组字母和最大

    字母A-J,用0-9对应字母使得n组数据和最大,输入字符串前面保证非0 如输入组数据: 2 ABC BCA 输出: 1875 思路:其实就是求和,对应字符乘以相应的量级,按系数排序 如上MAX(101 ...

  3. cp -拷贝文件出现错误

    对于cp -a最主要的用法是在保留原文件属性的前提下复制文件. 如果出现了拷贝文件错误,在文件前面加上-a 即可

  4. MapReduce05 框架原理OutPutFormat数据输出

    目录 4.OutputFormat数据输出 OutputFormat接口实现类 自定义OutputFormat 自定义OutputFormat步骤 自定义OutputFormat案例 需求 需求分析 ...

  5. 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka

    1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...

  6. Android 清除本地缓存

    主要功能:清除内.外缓存,清除数据库,清除Sharepreference,清除files和清除自定义目录 public class DataCleanManager { //清除本应用内部缓存(/da ...

  7. 【Linux】【Commands】systemd

    1. 系统启动流程:POST --> Boot Sequeue(BIOS) --> Bootloader(MBR) --> Kernel(ramdisk) --> rootfs ...

  8. 20 个 .NET 6 新增的 API

    DateOnly & TimeOnly .NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分. DateOnly ...

  9. Mysql报错合集

    目录 一.链接报错 客户端连接mysql出错 链接客户端出错 交互登陆mysql出现warning警告Using a password 导入数据到数据库报错ERROR 1050 登陆数据库提示-bas ...

  10. Kerboros 认证

    转:Kerberos介绍(全)