CF2053F Earnest Matrix Complement

news/2025/1/4 22:32:26/文章来源:https://www.cnblogs.com/dixiao/p/18650989

CF2053F Earnest Matrix Complement

题意:

多测

每次给定 \(n,m,k\) ,存在一个 \(n \times m\) 的表格,其中 \(a_{i,j} \in {[1,k]\ \text{and}\ -1}\)

\(c_{i,j} = \sum_{p = 1}^m {[a_{i,p} = j]}\)

最后 \(V = \sum_{i = 2}^n \sum_{j = 1}^{n \times m} c_{i - 1,j} \times c_{i,j}\),你可以为每个 \(-1\) 分配一个数字,求最大的 \(V\)

\(\sum n\times m \leq 6\times 10^5,k \leq n\times m\)

观察一:每行的 \(-1\) 只会填同一个数。

我们这里只简单考虑两行的情况,且两行只有 \(1/2\) 两种颜色,更复杂的情况可以从这里进行推知。

我们考虑第一行的涂色情况为 \(c_{1,1} = p_1,c_{1,2} = p_2\)

那么我们考虑第二行的涂色情况,\(c_{2,1} = x,c_{2,2} = m - x\)

\(V = p_1 \times x + p_2 \times (m - x) = (p_1 - p_2)\times x + p_2 \times m\)

容易知道这个函数肯定最值取在一端,于是推知每行的 \(-1\) 只会填一个数。

对于更复杂的情况,可以通过每次合并两种颜色来进行处理推至。

基于这个观察,我们容易写出一个 \(dp\) 式子。

\(f_{i,x}\) 为第 \(i\) 行涂 \(x\) 颜色所取得的最大值

我们容易写出转移式 \(f_{i,x} = \max_{y} f_{i - 1,y} + \text{conv(i,x,y)}\)

这里 \(\text{conv(i,x,y)}\) 表示第 \(i\) 行涂 \(x\) ,上一行涂 \(y\) 的贡献

于是我们得到了一个 \(O(nk)\) 复杂度的转移式。

我们先回顾我们所得到的结论,我们 \(dp\) 柿子应该是写的非常正确的,我们想要优化,只能尝试从 \(\text{conv(i,x,y)}\) 上来得到了

我们将 \(\text{conv}(i,x,y)\) 展开书写

这里我们令

\(nc_{i,c}\) 表示不计算 \(-1\) 在内的第 \(i\) 行的 \(c\) 的数量

\(p_i\) 表示第 \(i\) 行的 \(- 1\) 数量

\(\text{conv(i,x,y)} = \sum_{c \neq x \ \text{and}\ c \neq y} nc_{i - 1,c} \times nc_{i,c} + (nc_{i - 1,y} + p_{i - 1}) \times nc_{i,y} + (nc_{i,x} + p_{i}) \times nc_{i - 1,x} + [x = y]p_{i - 1}\times p_{i} - [x = y] nc_{i,x} \times nc_{i - 1,y}\)

把贡献拆分开来,将贡献分为三部分,一部分来自于两边都是确定的颜色,一部分来自于一边确定一边不确定,一部分来自于两边都不确定

\(\text{conv(i,x,y)} = \sum_{c} nc_{i - 1,c} \times nc_{i,c} + p_{i - 1} \times nc_{i,y} + p_{i} \times nc_{i - 1,x} + [x = y]p_{i - 1}\times p_{i}\)

\(\text{conv(i,x,y)} = W + p_{i - 1} \times nc_{i,y} + p_{i} \times nc_{i - 1,x} + [x = y]p_{i - 1}\times p_{i}\)

形式一下变得优美太多。

考虑我们在转移的时候如何操作呢

这里柿子的第二项表示如果我们从 \(f_{i-1,y}\) 转移到 \(f_{i,x}\) 会加上 \(p_{i - 1} \times nc_{i,y}\)

这里柿子的第三项表示我们 \(f_{i,x}\) 需要加上 \(p_{i} \times nc_{i - 1,x}\)

第四项表示若 \(f_{i - 1,x}\) 转移到 \(f_{i,x}\) 需要额外加上 \(p_{i - 1} \times p_i\)

于是我们改写原本的转移方程 \(f_{i,x} = \max_y f_{i - 1,y} + \text{conv(i,x,y)} = W + p_i \times nc_{i - 1,x} + \max {(f_{i - 1,y} + p_{i - 1} \times nc_{i,y} + [x = y]p_{i - 1} \times p_{i})}\)

我们把 \(x = y\) 的情况特殊写出来

\(f_{i,x} = W + p_i \times nc_{i - 1,x} + \max(f_{i - 1,x} + p_{i - 1} \times nc_{i,x} + p_{i - 1} \times p_{i},\max {(f_{i - 1,y} + p_{i - 1} \times nc_{i,y}))}\)

我们回顾这个柿子,其中 \(nc_{i,y}\) 只在 \(y \in S_i\) 中不为 0,我们可以枚举这些颜色,然后先处理出 \(\max(f_{i - 1,y} + p_{i - 1} \times nc_{i,y}) = rmax\)

接着我们发现第一项这里等价于,先给所有位置都加上 \(p_{i - 1} \times p_i\),再枚举所有颜色,为 \(f_{i - 1,x}\) 加上 \(p_{i - 1} \times nc_{i,x}\)

最后对所有位置,对 \(rmax\)\(\max\)

然后同样的,我们最后对所有位置加 \(W\),然后对有值的 \(p_i \times nc_{i - 1,x}\) 加上即可。

于是我们回顾我们的操作,我们需要支持一个 全局加,单点加,全局取 \(\max\),查询全局 $\max $

我们当然可以直接随便上个吉司机线段树。

这里提供一个线性实现的做法,我们维护这样一个数据结构 \(f_i = \max(a_i + add,tmax)\)

我们每次全局加时令 \(add\)\(tmax\) 同时加

全局取 \(max\) 则取 \(tmax = maxx\)

单点加时,我们发现我们一直加的是一个正数,也就是我们实际上加完就不用管目前的取 \(max\) 限制了,于是我们直接令 \(a_i = f_i + b - x\) 即可

实际上就是标记永久化了一下。

维护全局 \(max\) 就顺手维护一下即可。

//画楼云雨无凭
#include<bits/stdc++.h>
#define ll long long 
#define N 600005int n,m,k;int nexmax;//f_{i,j} = \max(w + )struct P{ll adtag = 0;ll mxtag = 0;ll nmax = 0;ll f[N];void clear(){for(int i = 0;i <= n * m;++i)f[i] = 0;adtag = mxtag = nmax = 0;}void cover_ad(ll x){nmax += x;adtag += x;mxtag += x;}ll get(int ind){return std::max(f[ind] + adtag,mxtag);}void cover_mx(ll mx){nmax = std::max(nmax,mx);mxtag = std::max(mxtag,mx);}void change_ad(int ind,ll x){ll res = std::max(f[ind] + adtag,mxtag);ll to = res + x;f[ind] = to - adtag;nmax = std::max(nmax,to);}ll get_mx(){return nmax;}
}T;int c[N];
int a[N];
using std::map;
map<int,int>cnt[N];inline void solve(){scanf("%d%d%d",&n,&m,&k);T.clear();for(int i = 1;i <= n;++i)c[i] = 0,cnt[i].clear();for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){scanf("%d",&a[j]);if(a[j] == -1)c[i] ++ ;else cnt[i][a[j]] ++ ;}}for(int i = 2;i <= n;++i){ll c0 = c[i - 1],c1 = c[i];ll rmax = T.get_mx();ll w = 0;for(auto [x,_] : cnt[i - 1]){if(cnt[i].find(x) != cnt[i].end()){w = w + 1ll * cnt[i - 1][x] * cnt[i][x];}}for(auto [y,_] : cnt[i]){rmax = std::max(rmax,1ll * c0 * cnt[i][y] + T.get(y));}T.cover_ad(1ll * c0 * c1);for(auto [y,_] : cnt[i]){T.change_ad(y,1ll * c0 * cnt[i][y]);}T.cover_mx(rmax);T.cover_ad(w);for(auto [x,_] : cnt[i - 1]){T.change_ad(x,1ll * cnt[i - 1][x] * c1);}}std::cout<<T.get_mx()<<"\n";
}int main(){int _ = 1;	scanf("%d",&_);while(_ -- ){solve();}
}

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

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

相关文章

【金融安全】详解红筹架构的搭建

#金融与法律 #红筹架构 什么是红筹架构 红筹架构通常是指中国内地企业在境外(如中国香港、开曼群岛、英属维尔京群岛等地)设立特殊目的公司(SPV),然后将境内企业的资产或权益注入到这些SPV中,最终通过这些境外控股公司在境外交易所上市。红筹架构允许企业绕开国内直接上…

【金融安全】金融行业该如何保障数据安全?

近日,为规范银行业保险业数据处理活动,保障数据安全、金融安全,促进数据合理开发利用,维护社会公共利益和金融消费者合法权益,金融监管总局制定《银行保险机构数据安全管理办法》(以下简称《办法》)。《办法》强调了数据分类分级与安全管理的重要性,而身份数据作为最具…

IDEA 2024.3.1.1完整的安装教程(激活至2099年,以及常见问题处理)

卸载老版本 IDEA 首先,如果小伙伴的电脑上有安装老版本的 IDEA , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可): TIP:如果你之前使用过本站提供的 激活到 2025 年版本脚本,需要执行对应卸载脚本 /适用2024版本/JetBrains 2023 最新全家桶/jetbra /scrip…

R机器学习:神经网络算法的理解与实操,实例解析

神经网络算法是一种模仿生物神经网络(尤其是人脑)结构和功能的算法。它由大量相互连接的节点(称为神经元)组成,这些神经元组织成层,通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演着至关重要的角色,尤其擅长处理复杂的模式识别、分类和预测问题…

jenkins导出单个作业

进入下面页面,下载jenkin-cli.jar包。java -jar jenkins-cli.jar -s http://192.168.1.205:8080 -auth admin:xxx get-job job1 > job1.xml

DesignWare IP使用——层次化综合加快总体综合速度

记录一下目前综合时遇到的一点小问题。 目前的设计的计算模块里大量使用了DW IP,包括浮点除法器,浮点加减法器,浮点乘法器,浮点求根器,浮点比较器等每个各32个,直接综合的话会发现这些大的计算单元每个都需要进行mapping,会导致综合的总时长长的难以想象(可能需要数天的…

python 长数据转宽数据

import pandas as pd# 长格式数据 df_long = pd.DataFrame({id: [A, A, B, B, C, C],year: [2020, 2021, 2020, 2021, 2020, 2021],value: [10, 15, 20, 25, 30, 35] })print(df_long) df_wide = df_long.pivot(index=id, columns=year, values=value) print(df_wide)

第十八次作业

1、sql注入漏洞中,常见的防护方案有哪些?请简述原理和用法 类型转换: 将输⼊强制转换为整数/浮点 ⽤于整数/浮点类型的输⼊参数处理,可防⽌SQL注⼊。 intval($input) floatval() floor() (int)$input $input + 0 特殊字符转义: addslashes 在单引号()、双引号(")、反…

【自动化测试】Pytest之conftest详解

conftest介绍 pytest中定义个conftest.py来实现数据,参数,方法、函数的共享。 conftest.py 的文件名称是固定的, pytest 会自动识别该文件,可以理解成一个专门存放 fixture 的配置文件。一个工程下可以建多个 conftest.py 文件,一般我们都是在工程根目录下设置的 conftest…

【Spring开发】 老板爱瞎改权限怎么办:注解+AOP 打造复杂权限体系

引言一、权限控制的基本概念二、系统需求分析三、库表设计四、权限控制的注解设计五、切面实现六、权限控制的业务逻辑实现七、结论引言 在软件开发的世界里,权限控制是确保数据安全和业务流程合规性的关键。然而,当老板或管理层频繁地调整权限设置时,这不仅会打乱开发节奏,…

01.03 CW 模拟赛 T2. game

思路 先把赛时的思路搬一下你发现确定两个人的起始点, 其实是可以确定 \(\rm{Alice}\) 的选点可能的, 考虑写个代码验证一下 具体的, 就是分成两个弧, \(\rm{Alice}\) 可以选择一个弧的优势(过半), 然后其他的劣势 感觉现在是猜结论, 全靠感性, 我也不知道怎么解释这个问题 那么…

1.3 可压缩流:喷管和机翼

1.3 可压缩流:喷管和机翼 前言 劳张、劳江必看,劳高请随缘。 超音速喷嘴 基本 对于等熵流动,给出速度变化和管道截面面积变化的关系式: \[\begin{equation}(M^2-1)\frac{dV}{V}=\frac{dA}{A} \end{equation} \]对该公式分3种情况讨论:低速、亚音速,M<1:此时\(M^2-1&l…