「Dasha and Photos」Solution

简述题意

给定一个 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.mzph.cn/bicheng/7983.shtml

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

相关文章

【LAMMPS学习】八、基础知识(5.11)磁自旋

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案&#xff0c;它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉&#xff0c;号称音视频界的瑞士军刀。同时&#xff0c;FFmpeg 有三大利器是我们应该清楚的&#xff0c;它们…

2024年第九届数维杯数学建模B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

Ansible-playbook剧本

目录 一、Ansible playbook简介 2.1 playbook格式 2.2 playbook组成部分 二、playbook示例 2.1 yaml文件编写 2.2 运行playbook 2.3 定义、引用变量 2.4 指定远程主机sudo切换用户 ​编辑 2.5 when条件判断 ​编辑​编辑 2.6 迭代 ​编辑 ​编辑 三、总结 Ansib…

2023黑马头条.微服务项目.跟学笔记(五)

2023黑马头条.微服务项目.跟学笔记 五 延迟任务精准发布文章 1.文章定时发布2.延迟任务概述 2.1 什么是延迟任务2.2 技术对比 2.2.1 DelayQueue2.2.2 RabbitMQ实现延迟任务2.2.3 redis实现3.redis实现延迟任务4.延迟任务服务实现 4.1 搭建heima-leadnews-schedule模块4.2 数据库…

简单了解泛型

基本数据类型和对应的包装类 在Java中, 基本数据类型不是继承自Object, 为了在泛型代码中可以支持基本类型, Java给每个基本类型都对应了一个包装类型. 简单来说就是让基本数据类型也能面向对象.基本数据类型可以使用很多方法, 这就必须让它变成类. 基本数据类型对定的包装类…

sql注入练习

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一&#xff0c;它不是利用操作系统的BUG来实现攻击&#xff0c;而是针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号登录&#xff0c;甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

能将图片转为WebP格式的WebP Server Go

本文完成于 2023 年 11 月 之前老苏介绍过 webp2jpg-online&#xff0c;可以将 webp 格式的图片&#xff0c;转为 jpg 等&#xff0c;今天介绍的 WebP Server Go 是将 jpg 等转为 webp 格式 文章传送门&#xff1a;多功能图片转换器webp2jpg-online 什么是 WebP ? WebP 它是由…

Vue 路由

单应用程序 SPA - Single Page Application 所有功能在一个html页面上实现 单页面应用 多用于 系统类网站/内部网站/文档类网站/移动端站点 多页面应用 多用于 公司官网/电商类网站 路由 单页面应用按需更新页面&#xff0c;需要明确访问路径和组件的对应关系 Vue中的路…

重学java 30.API 1.String字符串

于是&#xff0c;虚度的光阴换来了模糊 —— 24.5.8 一、String基础知识以及创建 1.String介绍 1.概述 String类代表字符串 2.特点 a.Java程序中的所有字符串字面值(如“abc”)都作为此类的实例(对象)实现 凡是带双引号的&#xff0c;都是String的对象 String s "abc&q…

修改ElTable组件的样式(element-plus)

效果展示 <div class"table_main"><ElTable:data"tableList":header-cell-style"{color: #ffffff,background: #6f7f93,}"class"table_border":highlight-current-row"false"><ElTableColumn type"inde…

CentOS 自建gitlab仓库:安装相关工具

所需环境 Node 安装项目依赖、项目打包运行Nginx 前端项目部署&#xff08;正向代理、反向代理、负载均衡等&#xff09;Git 自动化部署时 拉取代码使用GitLab 代码仓库GitLab-Runner GitLab的CI/CD执行器 一、安装Node 检测是否已安装 常用node -v 命令检测。 如果已安装&a…

为什么你的企业需要微信小程序?制作微信小程序有什么好处?

什么是小程序&#xff1f; WeChat小程序作为更大的WeChat生态系统中的子应用程序。它们就像更小、更基本的应用程序&#xff0c;在更大的应用程序&#xff08;WeChat&#xff09;中运行。这些程序为用户提供了额外的高级功能&#xff0c;以便在使用WeChat服务时加以利用。根据…

DeepSeek发布全新开源大模型,GPT-4级别能力 价格仅百分之一

最新国产开源MoE大模型&#xff0c;刚刚亮相就火了。 DeepSeek-V2性能达GPT-4级别&#xff0c;但开源、可免费商用、API价格仅为GPT-4-Turbo的百分之一。 因此一经发布&#xff0c;立马引发不小讨论。 从公布的性能指标来看&#xff0c;DeepSeek-V2的中文综合能力超越一众开源…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付&#xff0c;支持二开&#xff0c;一次付款&#xff0c;终身使用&#xff0c;免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目&#xff0c;旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…

Hive Bucketed Tables 分桶表

Hive Bucketed Tables 分桶表 1.分桶表概念 2.分桶规则 3.语法 4.分桶表的创建 5.分桶表的好处

工厂自动化升级改造(2)-RS485与Modbus通信协议

在工业控制、电力通信、智能仪表等领域,数据交换通常依赖于串口通信。最初,RS232接口是主流选择,然而,由于工业现场的复杂性,各种电气设备产生的电磁干扰可能导致信号传输错误。 RS232和RS485是两种不同的串行通信协议,它们在电气特性、传输距离和拓扑结构等方面有所不同…

LINUX 入门 6

LINUX 入门 6 day10 20240505 耗时&#xff1a;41min day10 20240506 耗时&#xff1a;155min 课程链接地址 第6章 DNS协议与请求 1 DNS协议分析与项目介绍 自己去看教程 快速扫了一下&#xff0c;还是结合实践去看概念有感觉 回答以下几个问题&#xff1a; dns作用dns分层…

信息安全-古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…