Fake Maxpooling(2020多校第二场F)

本文解析了FakeMaxpooling问题,通过二维滑动窗口优化算法,在O(nm)的时间复杂度内找到所有k*k子矩阵的最大值并求和。介绍了如何使用单调队列将二维问题转化为一维处理,实现高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fake Maxpooling(2020多校第二场F)

题意:

一个n * m的矩阵,第i行第j列的值是lcm(i,j),然后给定一个 k * k的子矩阵(k<=min(n,m)),然后求出大矩阵中每个子矩阵的最大值的和
看样例:

3 4 2
38

给的矩阵是:
1 2 3 4
2 2 6 4
3 6 3 12
所有2 * 2的子矩阵的最大值分别是 :
2,6,6,6,6,12,总和是38

题解:

暴力求法是O(n m log n),先考虑O(n m)的做法

for(int i=1;i<=n;i++)
{
	for(int j=1;j<=m;j++)
	{
		if(!Gcd[i][j])
		for(int k=1;k*i<=n&&k*j<=m;k++)
		 Gcd[k*i][k*j]=k,A[k*i][k*j]=i*j*i*k;
	}
}

之后再用单调队列

曾经做过一个叫滑动窗口的题,其实和这个是一个类型,那个是一维的,本题这个是二维的
滑动窗口的题解(含题目链接)
分别求出每行和每列的k个长度区间的最大值
tail表示尾,head表示头,不断得到区间内的最大值,并存进b中,最终覆盖给a
其实就是把二维的拆分成行和列的一维,然后分别进行和滑动窗口那个题一样的操作

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+5;
int a[maxn][maxn];
int b[maxn];
int qu[maxn];
int n,m,k;
int gcd(int a,int b)
{
	if(b==0)return a;
	else return gcd(b,a%b);
}
int lcm(int a,int b)
{
	return a*b/gcd(a,b);
}
void getr(int j)//固定列 
{
	memset(qu,0,sizeof(qu));
	int head=0;
	int tail=1;
	for(int i=1;i<=n;i++)
	{
		while(head<=tail&&qu[head]+k<=i)head++;
		while(head<=tail&&a[i][j]>a[qu[tail]][j])tail--;
		qu[++tail]=i;
		if(i>=k)
		b[i-k+1]=a[qu[head]][j];	
	}
	for(int i=1;i<=n-k+1;i++)
	a[i][j]=b[i];

}
void getl(int i)//固定行 
{
	memset(qu,0,sizeof(qu));
	int head=0;
	int tail=1;
	for(int j=1;j<=m;j++)
	{
		while(head<=tail&&qu[head]+k<=j)head++;
		while(head<=tail&&a[i][j]>a[i][qu[tail]])tail--;
		qu[++tail]=j;
		if(j>=k)
		b[j-k+1]=a[i][qu[head]];
	}
	for(int j=1;j<=m-k+1;j++)
	a[i][j]=b[j];
}
int main()
{
	
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		a[i][j]=lcm(i,j);
	}
	for(int i=1;i<=m;i++)
	getr(i);
	for(int i=1;i<=n;i++)
	getl(i);
	long long  sum=0;
	for(int i=1;i<=n-k+1;i++)
	{
		for(int j=1;j<=m-k+1;j++)
		{
			sum+=a[i][j];
		}
	}
	printf("%lld\n",sum);
}
### 关于园跑 Fake Location 的实现方法及相关问题 #### 实现 Fake Location 解锁专业版的方法 为了实现 Fake Location 功能并解锁其专业版,在某些情况下可以采用特定的技术手段。例如,通过修改应用程序配置文件来达到目的。具体来说,可以通过编辑 `appconfigs.xml` 文件中的设置项以调整应用行为[^2]。 对于 Android 设备而言,通常需要具备 root 权限才能访问和更改系统级别的文件。一旦获得适当权限,则可以在路径 `/data/user_de/0/com.lerist.fakelocation/shared_prefs/` 下找到目标 XML 配置文件,并对其进行必要的改动。完成这些操作之后,还需要确保该目录下的文件拥有正确的读写执行权限(如 551),以便程序能够正常运行。 然而值得注意的是,这种做法可能违反服务条款,并且存在一定的风险性和不确定性。因此建议谨慎行事,并充分考虑潜在后果后再做决定[^3]。 #### 使用虚拟机或模拟器的风险提示 尽管理论上讲,利用虚拟机或者安卓模拟器也可以尝试实现类似的伪造地理位置功能,但实际上这样做往往难以稳定工作。由于这类环境中缺乏真实的硬件支持以及复杂的传感器交互机制,使得很依赖于此的应用无法正常使用。此外,随着开发者不断加强安全性措施,基于非真实设备的操作越来越受到限制。 #### 安全注意事项与合法合规提醒 在任何情况下都应该注意个人信息安全保护和个人隐私维护;同时也要遵守法律法规和服务提供商的相关规定。非法篡改软件可能会带来账号封禁或者其他不利影响。所以当涉及到此类敏感话题时务必保持警惕,避免因贪图一时便利而造成不必要的损失[^4]。 ```python import os def set_file_permission(file_path, permission='551'): try: os.chmod(file_path, int(permission, base=8)) print(f"File permissions updated successfully to {permission}") except Exception as e: print(f"Failed to update file permissions: {e}") set_file_permission('/path/to/file') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值