首页 > 其他分享 >理想的正方形——题解

理想的正方形——题解

时间:2024-02-18 22:11:44浏览次数:31  
标签:储存 理想 int 题解 head 正方形 tail maxn

题目描述

image

一看正方形,得,二维数组,单调队列。
单调队列可以将一个区间最大值存储,所以只需要根据给定的正方形长度先横着推一遍,再竖着推一遍,将正方形中的最大值和最小值都储存在正方形右下角方格,最后遍历即可。
先以行储存以k为长度的最大/小值;
再以剩下k-m横向长度的最值向下扩展k个长度,储存在长k宽k的矩阵右下角位置;
最后便利最小值;
例子 : n = 5,m = 4, k = 2.
image

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n,m,k,w[maxn][maxn],row_min[maxn][maxn],row_max[maxn][maxn],q[maxn*maxn];
void get_min(int a[],int b[],int c){//单调数组 储存 次数
	int head=0,tail=-1;
	for(int i=1;i<=c;i++){
		while(head<=tail&&q[head]<i-k+1)//k=2,i=5例4~5 头最多i-k+1
			head++;
		while(head<=tail&&a[q[tail]]>=a[i])
			tail--;
		q[++tail] = i;
		b[i]=a[q[head]];
	}
}
void get_max(int a[],int b[],int c){//单调数组 储存 次数
	int head=0,tail=-1;
	for(int i=1;i<=c;i++){
		while(head<=tail&&q[head]<i-k+1)
			head++;
		while(head<=tail&&a[q[tail]]<=a[i])
			tail--;
		q[++tail] = i;
		b[i]=a[q[head]];
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			scanf("%d",&w[i][j]);
		}
	for(int i=1;i<=n;i++){//扫行最值
		get_min(w[i],row_min[i],m);
		get_max(w[i],row_max[i],m);
	}
	int t[maxn],a[maxn],b[maxn];
	int res=0x3f3f3f3f;
	for(int j=k;j<=m;j++){
		for(int i=1;i<=n;i++) t[i]=row_min[i][j];//存t,向下遍历
		get_min(t, a, n);
		for(int i=1;i<=n;i++) t[i]=row_max[i][j];//存t,向下遍历
		get_max(t, b, n);

		for(int i=k;i<=n;i++){//扫列
			res=min(res,b[i]-a[i]);
		}

	}
	printf("%d",res);
	return 0;
}

标签:储存,理想,int,题解,head,正方形,tail,maxn
From: https://www.cnblogs.com/dfxjlsx/p/18020034

相关文章

  • 跨域问题解决
    跨域举例A网站部署在localhost:63343请求loocalhost:8080/api/user/add,就会出现跨域问题。同源策略同源策略:协议,主机,端口,只有这三者全部相同时,才可以相互访问。现在接口地址为101.10.11.1X:8081,请判断以下哪些可以通过:访问地址描述结果https://127.0.0.1:808......
  • 数列的异或和(题解)
    题目样例样例输入5512345113135036113135样例输出0257二进制运算二进制运算的优先级小于四则运算,所以在与四则运算同时出现时,注意加括号按位与(&)在二进制下,相同位的数都为1时,这一位的结果为1,任意一个不是1或都是0,则为0(eg:0100110&0010111=000......
  • 场景问题解决方法
    1.tomcatspringboot通过域名访问时直接跳到127.0.0.1的问题这种情况极可能是因为 server.xml配置问题导致,可以参考这篇文章tomcat设置http代理详细教程-知乎(zhihu.com)2.如何访问内网中所有的服务和站点要访问一个内网中所有的服务和站点(如内网的所有网站和数据库等),......
  • think-cell Round 1 题解 (A~F)
    think-cellRound1.目录A.MaximiseTheScore排序后输出所有奇数位之和.B.PermutationPrinting\(1,n,2,n-1\cdots\).C.LexicographicallyLargest注意到对于一个\(a_i\)来说\([a_i+1,a_i+i]\)中的所有数都可以被选中,那么问题变给若干区间,每个区间选一个数要......
  • [ARC122E] Increasing LCMs 题解
    Description给定长度为\(N\)的正整数序列\(\{A_i\}\),满足\(A_i\)单调升。问是否能将\(\{A_i\}\)重排为序列\(\{x_i\}\),满足:令\(y_i=\operatorname{LCM}(x_1,\dots,x_i)\),\(\forall1\lei<N,y_i<y_{i+1}\)(即\(y_i\)单调升)。$1\\leq\N\\leq\......
  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......
  • 11.【题解】最短母串
    最短母串hzoi题解题意给你几个字符串,给你密码长度,之后求出密码有多少种可能,其中如果方案数\(\leq42\),则需要按字典序输出所有方案。题解首先先求出每两个字符串的最大重合,记为\(\largerel{_i}{_,}{_j}\)(\(relation\),在枚举时使用。(其实应该用\(dfs\)),但蒟蒻太蒻......
  • HH的项链——题解
    题目描述直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出现的地方,方便转移下面附代码solution#include<bits/stdc++.h>using......
  • 区间最大子区间和——山海经题解
    区间最大子区间和规定:ls:区间靠左部分子区间最大和rs:区间靠右部分子区间最大和ms:区间子区间最大和s:区间和方程与数量关系如图所示,可以用动态规划解决山海经题解这题是上述方法在线段树中的应用solution#include<bits/stdc++.h>usingnamespacestd;constintmax......
  • 寒假训练——vj题解
    B-BM算日期M是一位数学高手,今天他迎来了Kita的挑战。Kita想让BM算出这几年内有多少个闰年。BM觉得这问题实在太简单了,于是Kita加大了难度。他先给出第一个年份,再给出一个整数。Kita要BM进行加法运算后得到第二个年份,然后算出这两个年份之间有多少个闰年。然......