「Dasha and Photos」Solution

news2024/11/25 16:04:11

简述题意

给定一个 n × m n \times m n×m 的方格,每个格子里有一个小写英文字母。

现在你有 k k k n × m n \times m n×m 的方格,这些方格都是给定方格的基础上将左上角为 ( a i , b i ) (a_i,b_i) (ai,bi),右下角为 ( c i , d i ) (c_i,d_i) (ci,di) 的矩形区域的方格中的字母替换成字符 e i e_i ei

定义两个方格的距离为所有格子中字母在 Ascll \text{Ascll} Ascll 码的差累和。你要找到 k k k 个方格中的一个方格,满足它到其他 k − 1 k-1 k1 个矩阵的距离之和最小,并输出这个最小值。

  • 1 ≤ n , m ≤ 1000 , 1 ≤ k ≤ 3 × 1 0 5 1 \le n,m \le 1000,1 \le k \le 3 \times 10^5 1n,m10001k3×105
  • 1 ≤ a i , b i ≤ n , 1 ≤ c i , d i ≤ m 1 \le a_i,b_i \le n,1 \le c_i,d_i\le m 1ai,bin,1ci,dim

思路

以下简记:

  • X ( a i , b i , c i , d i ) X(a_i,b_i,c_i,d_i) X(ai,bi,ci,di) 表示 X X X 矩阵的左上角为 ( a i , b i ) (a_i,b_i) (ai,bi),右下角为 ( c i , d i ) (c_i,d_i) (ci,di) 的子矩阵的元素之和
  • A A A 表示原矩阵。

首先不难想到枚举每一个矩阵,求出其到其他 k − 1 k-1 k1 个矩阵的距离和,取最小值即可,然而我们难以直接维护当前枚举到的矩阵与其他矩阵的距离和。

注意到,每一个新矩阵与原矩阵唯一的差别便是一个子矩阵不一样,套路地想到维护原矩阵。

不妨令 w i , j , k w_{i,j,k} wi,j,k k k k 个新矩阵中, ( i , j ) (i,j) (i,j) 这一位的字母为 k k k 的数量, c n t i , j cnt_{i,j} cnti,j 表示 k k k 个新矩阵中有多少个矩阵与原矩阵不同的位置包含了 ( i , j ) (i,j) (i,j)

考虑如何求出 w w w 数组。不妨先让 ∀ x ∈ [ 1 , n ] , y ∈ [ 1 , m ] , w x , y , A x , y = k \forall x \in [1,n],y \in [1,m],w_{x,y,A_{x,y}}=k x[1,n],y[1,m]wx,y,Ax,y=k,后面减去掉原矩阵贡献的这一部分即可。而后,每生成一个矩阵,就相当于把 ∀ x ∈ [ a i , b i ] , y ∈ [ c i , d i ] , w x , y , e i ← w x , y , e i + 1 , c n t x , y ← c n t x , y + 1 \forall x \in [a_i,b_i],y \in[c_i,d_i],w_{x,y,e_i} \leftarrow w_{x,y,e_i}+1,cnt_{x,y} \leftarrow cnt_{x,y}+1 x[ai,bi],y[ci,di],wx,y,eiwx,y,ei+1,cntx,ycntx,y+1,最后统一把 x ∈ [ 1 , n ] , y ∈ [ 1 , m ] , w x , y , A x , y ← w x , y , A x , y − c n t x , y x \in [1,n],y \in [1,m],w_{x,y,A_{x,y}} \leftarrow w_{x,y,A_{x,y}} - cnt_{x,y} x[1,n],y[1,m],wx,y,Ax,ywx,y,Ax,ycntx,y 即可。

有了 w w w 数组后,就可以求出原矩阵与 k k k 个新矩阵的距离和。具体地,枚举 ( i , j ) (i,j) (i,j),那么当前位置与 k k k 个矩阵对应位置的差值和即为: r e s i , j = ∑ o ∈ S w i , j , o × ∣ A i , j − o ∣ res_{i,j}=\sum_{o \in S}w_{i,j,o} \times |A_{i,j}-o| resi,j=oSwi,j,o×Ai,jo,其中 o o o 为字符, S S S 为字符集。

有了 r e s res res 数组之后就大功告成了!

而后,枚举每一个新矩阵,先继承一下原矩阵的贡献,就是 r e s ( 1 , 1 , n , m ) − r e s ( a i , b i , c i , d i ) res(1,1,n,m)-res(a_i,b_i,c_i,d_i) res(1,1,n,m)res(ai,bi,ci,di),紧接着考虑 ( a i , b i , c i , d i ) (a_i,b_i,c_i,d_i) (ai,bi,ci,di) 这个子矩阵对答案的贡献,显然就是 ∑ o ∈ S w o ( a i , b i , c i , d i ) × ∣ e i − o ∣ \sum_{o \in S}w_o(a_i,b_i,c_i,d_i) \times |e_i-o| oSwo(ai,bi,ci,di)×eio。(说人话 w o ( a i , b i , c i , d i ) w_o(a_i,b_i,c_i,d_i) wo(ai,bi,ci,di) 表示的就是 k k k 个矩阵每一个 ( a i , b i , c i , d i ) (a_i,b_i,c_i,d_i) (ai,bi,ci,di) 子矩阵中有多少个字符 o o o

总结一下,一个矩阵到其他 k − 1 k-1 k1 个矩阵的距离和即为:

r e s ( 1 , 1 , n , m ) − r e s ( a i , b i , c i , d i ) + ∑ o ∈ S w o ( a i , b i , c i , d i ) × ∣ e i − o ∣ res(1,1,n,m)-res(a_i,b_i,c_i,d_i)+\sum_{o \in S}w_o(a_i,b_i,c_i,d_i) \times |e_i-o| res(1,1,n,m)res(ai,bi,ci,di)+oSwo(ai,bi,ci,di)×eio

空间优化

如果你使用的是 区间修改,区间查询 的二维树状数组求解 w , r e s w,res w,res,那么恭喜你喜提 Memory limit exceeded on test 1 \text{Memory limit exceeded on test 1} Memory limit exceeded on test 1,因为每一个树状数组需要 4 4 4 b i t bit bit 数组,且需要 26 26 26 个这样的树状数组,空间炸飞了。

再仔细思考,发现此题的 区间修改,区间查询 不是同时进行的,所以不妨先差分,再前缀和求出每一位,再前缀和维护子矩阵的和,这样普通数组就可以解决。

代码

请自行忽略树状数组,当成差分看就行。

主要是最开始超空间限制,改了半截发现空间开得下了就懒得改了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1000 + 5 , MAXM = 3e5 + 5;
int n , m , k , a[MAXM] , b[MAXM] , c[MAXM] , d[MAXM];
ll Pre_T[MAXN][MAXN][26] , Pre_res[MAXN][MAXN] , res[MAXN][MAXN];
char mp[MAXN][MAXN] , opt[MAXM];
struct BIT{
	#define lowbit(x) (x & -x)
	int bit[MAXN][MAXN];
	void update(int k , int k2 , int x) {
		for (int i = k ; i <= n ; i += lowbit(i)) {
			for (int j = k2 ; j <= m ; j += lowbit(j)) {
				bit[i][j] += x;
			}
		}
	}
	ll Sum(int k , int k2) {
		ll sum = 0;
		for (int i = k ; i ; i -= lowbit(i)) {
			for (int j = k2 ; j ; j -= lowbit(j)) {
				sum += bit[i][j];
			}
		}
		return sum;
	} 
	void add(int a , int b , int c , int d , int x) {update(a , b , x) , update(a , d + 1 , -x) , update(c + 1 , b , -x) , update(c + 1 , d + 1 , x);}
}T[27];
ll query1(int a , int b , int c , int d , int opt) {return Pre_T[c][d][opt] - Pre_T[a - 1][d][opt] - Pre_T[c][b - 1][opt] + Pre_T[a - 1][b - 1][opt];}
ll query2(int a , int b , int c , int d) {return Pre_res[c][d] - Pre_res[a - 1][d] - Pre_res[c][b - 1] + Pre_res[a - 1][b - 1];}
signed main() { 
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	cin >> n >> m >> k;
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = 1 ; j <= m ; j ++) {
			cin >> mp[i][j];
		}
	}
	for (int i = 1 ; i <= k ; i ++) {
		cin >> a[i] >> b[i] >> c[i] >> d[i] >> opt[i];
		T[opt[i] - 'a'].add(a[i] , b[i] , c[i] , d[i] , 1);
		T[26].add(a[i] , b[i] , c[i] , d[i] , 1);
	}
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = 1 ; j <= m ; j ++) {
			int sel = T[26].Sum(i , j);
			T[mp[i][j] - 'a'].add(i , j , i , j , k - sel); 
		}
	}
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = 1 ; j <= m ; j ++) {
			int now = mp[i][j] - 'a';
			for (int o = 0 ; o < 26 ; o ++) res[i][j] += 1ll * abs(now - o) * T[o].Sum(i , j);
		}
	}
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = 1 ; j <= m ; j ++) {
			Pre_res[i][j] = Pre_res[i - 1][j] + Pre_res[i][j - 1] - Pre_res[i - 1][j - 1] + res[i][j];
			for (int o = 0 ; o < 26 ; o ++) {
				Pre_T[i][j][o] = Pre_T[i - 1][j][o] + Pre_T[i][j - 1][o] - Pre_T[i - 1][j - 1][o] + T[o].Sum(i , j);
			} 
		}
	}
	ll ans = 1e16;
	for (int i = 1 ; i <= k ; i ++) {
		int now = opt[i] - 'a';
		ll w = query2(1 , 1 , n , m) - query2(a[i] , b[i] , c[i] , d[i]);
		for (int o = 0 ; o < 26 ; o ++) w += 1ll * abs(now - o) * query1(a[i] , b[i] , c[i] , d[i] , o);
		ans = min(ans , w);
	}
	cout << ans;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI原生实践:测试用例创作探索

测试用例作为质量保障的核心&#xff0c;影响着研发-测试-发布-上线的全过程&#xff0c;如单元测试用例、手工测试用例、接口自动化用例、UI 自动化用例等&#xff0c;但用例撰写的高成本尤其是自动化用例&#xff0c;导致了用例的可持续积累、更新和迭代受到非常大制约。长久…

深入理解Java虚拟机(JVM)

引言&#xff1a; Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换成平台特定的机器指令&#xff0c;并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写&#xff0c;到处运行”的跨平台特性。本文将深入探…

安装nginx-1.25.5与ngx_http_headers_more_filter_module模块

#下载nginx的代码 curl -O http://nginx.org/download/nginx-1.25.5.tar.gz #下载headers-more-nginx-module代码 git clone https://github.com/openresty/headers-more-nginx-module#解压 tar -xzf nginx-1.25.5.tar.gzcd nginx-1.25.5#--add-dynamic-module 下载下来的目录 …

简单两步将Lllama、Qwen等开源大模型安装到自己的电脑上

现在已经有非常多优秀的开源大语言模型了&#xff0c;比如Command R、Mistral、Qwen、MiniMax、Baichuan、Phi3等&#xff0c;其中Lllama3和Qwen等已经和GPT4的性能比较接近了。 如果能把这些免费的开源大模型部署到本地电脑或手机上&#xff0c;可以完全自由的使用&#xff0…

前后端分离项目中的一些疑惑

1、前后端分离项目&#xff0c;浏览器发起请求后&#xff0c;请求的是前端服务器还是后端服务器&#xff1f; 在前后端分离的项目中&#xff0c;当浏览器发起请求时&#xff0c;它首先会请求的是前端服务器。 前后端分离的工作流程大致如下&#xff1a; 用户在浏览器中输入网…

[Algorithm][多源BFS][矩阵][飞地的数量][地图中的最高点][地图分析] + 多源BFS原理讲解 详细讲解

目录 0.原理讲解1.矩阵1.题目链接2.算法原理详解3.代码实现 2.飞地的数量1.题目链接2.算法原理详解3.代码实现 3.地图中的最高点1.题目链接2.算法原理详解3.代码实现 4.地图分析1.题目链接2.算法原理详解3.代码实现 0.原理讲解 注意&#xff1a;只要是用**BFS解决的最短路径问题…

淘宝数据分析——Python爬虫模式♥

大数据时代&#xff0c; 数据收集不仅是科学研究的基石&#xff0c; 更是企业决策的关键。 然而&#xff0c;如何高效地收集数据 成了摆在我们面前的一项重要任务。 本文将为你揭示&#xff0c; 一系列实时数据采集方法&#xff0c; 助你在信息洪流中&#xff0c; 找到…

每日OJ题_贪心算法三③_力扣45. 跳跃游戏 II(dp解法+贪心解法)

目录 力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 力扣45. 跳跃游戏 II 45. 跳跃游戏 II 难度 中等 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 num…

如何设置ddns动态域名服务实现外网访问

在本地搭建好服务器&#xff0c;部署好web网站或其他应用后&#xff0c;需要在外网访问内网时&#xff0c;如何设置动态域名服务ddns&#xff0c;将主机的内网IP端口映射到外网访问&#xff0c;是我们需要面对的一个重要步骤。 内网发布外网&#xff0c;常见的有两种方案&…

C语言程序设计(三)

1、数据的两种表现形式 常量&#xff1a;其值不能被改变的量称为常量。 变量&#xff1a; 单撇号内只能包含一个字符。双撇号内可以包含一个字符串。 注意&#xff1a;要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存只是一个临时符号,代表一个值,在预编译…

QT和Halcon联合编程--注意是Ubuntu--

1.在QT目录下面的.pro文件下&#xff0c;如图所示&#xff1a; 根据你电脑的haclon的安装路径&#xff0c;添加如下代码&#xff1a; INCLUDEPATH /opt/halcon/include LIBS -L/opt/halcon/lib/x64-linux -lhalconcpp 需要等待一下&#xff0c;QT需要进行加载 2.在头文件中…

【综述】碳达峰、碳中和、碳足迹

文章目录 概念定义 碳足迹计算 动力蓄电池碳足迹 服务应用 参考资料 概念定义 温室气体&#xff0c;大气层中自然存在的和由于人类活动产生的能够吸收和散发由地球表面、大气层和云层所产生的、波长在红外光谱内的辐射的气态成分。包括二氧化碳&#xff08;CO2&#xff09…

HIVE简单数据查询

HIVE简单数据查询 1.where WHERE 过滤条件 between/ in / is NULL / IS NOT NULL / > < ! ... 如果多个存在多个过滤条件 可以用 AND OR 进行条件关联 或者是用NOT 进行条件结果取反 2.JOIN JOIN 内连接 左外连接 右外连接 自连接 满连接…

Unity 性能优化之LOD技术(十)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 LOD技术效果一、LOD技术是什么&#xff1f;二、LODGroup组件介绍三、LODGroup组件使用步骤添加组件添加模型 四、Project Settings中与LOD组件相关参数总结 L…

视觉图像信息处理与FPGA实现第九次作业——直方图均衡

RAM的B站视频解析 RAM的文档 一、65536x8位的单端口RAM timescale 1ns / 1ps //SPRF Single Port Read/Write Function //65535 是RAM中总的字数&#xff0c;也就是存储深度&#xff0c;X8表示每个字是8位的 module SPRF65536X8(Q,CLK,CEN,WEN,A,D );//输出寄存器Qoutput [7…

k8s集群统一设置时间

1 安装时间同步需要软件 yum install -y ntpdate2 设置时间 2.1 手动设置时间 date -s "20190712 18:30:50" hwclock --systohc2.2 在线更新时间 ntpdate 0.asia.pool.ntp.org # 强制把系统时间写入CMOS clock -w3 强制把系统时间写入CMOS hwclock作用与clock相…

N7552A是德科技N7552A电子校准件

181/2461/8938产品概述&#xff1a; 更小巧轻便的 2 端口模块&#xff0c;支持 3.5 mm 或 N 型 50 Ω 连接器&#xff0c;能够将校准时间缩短一半 特点 频率范围&#xff1a;直流至 9 GHz 使用 N 型或 3.5 mm 连接器 更小巧轻便的 2 端口电子校准件&#xff08;ECal&#xff…

电脑(爱好者) :基础知识1 了解你的电脑

读懂cpu 您想了解关于您的电脑的信息吗&#xff1f;CPuz是一款常用的系统信息工具&#xff0c;可以提供关于CPU、主板、内存等硬件信息的详细情况。您可以下载并运行该软件&#xff0c;然后查看您的电脑硬件配置信息。 图片来源于网络 CPU-Z 简介 CPU-Z 是一款功能强大且易于使…

迅为RK3568开发板资料说明4750+页专属文档专为3568编写

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

绝地求生:新型小队对决系统或将择日上线?

就在刚才&#xff0c;PUBG官博发布了一则短视频&#xff0c;视频内容为两只小队通过竞争积分排名产生不断地变化。 原文官博 视频内容 在这里我猜测为之前官方在2024工作计划视频中介绍过的新型小队对决系统&#xff1a; 据当时的介绍称&#xff1a;这个系统中&#xff0c;己方…