题解:CF573D Bear and Cavalry

news/2024/9/25 16:32:09

因为这是远古题目,所以根据现在的评测机速度,用 \(O(nq)\) 的做法也是可以过的。

也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种 \(O(n)\) 的算法求解答案。

这道题类似资源分配型动态规划,所以我们可以设 \(dp_i\) 表示分配前 \(i\) 个人的答案。

直接写是不行的,我们根据排序不等式先把 \(a\)\(b\) 数组排序,然后进行转移。首先有一个结论,在当前的状态下,\(i\) 只能由 \([i-2,i]\) 中间的状态转移过来,因为我们要求人和马连边以后逆序对数量最少,但是因为题目限制,所以 \([i-2,i]\) 之间的状态我们都需要考虑。

所以我们分四种情况转移,画个图方便理解(图很丑谅解一下):

然后根据上图我们可以列出来四个方程:

\[dp_i=\max \left\{ \begin{array}{lc} dp_{i-1}+a_ib_i&ch(i,i)\\ dp_{i-2}+a_ib_{i-1}+a_{i-1}b_i&ch(i,i-1)~and~ ch(i-1,i)\\ dp_{i-3}+a_ib_{i-2}+a_{i-2}b_{i-1}+a_{i-1}b_{i}&ch(i-2,i-1)~and~ch(i-1,i)~and~ch(i,i-2)\\ dp_{i-3}+b_ia_{i-2}+b_{i-2}a_{i-1}+b_{i-1}a_{i}&ch(i-2,i)~and~ch(i,i-1)~and~ch(i-1,i-2)\\ \end{array} \right. \]

其中 \(ch(i,j)\) 的含义是 \(a_i\)\(b_j\) 可以匹配。

为了维护 \(ch\) 这个条件,我们不妨存储 \(a\) 数组和 \(b\) 数组每个元素的编号,并设立一个新数组 \(fa\),然后令 \(fa_i\) 表示 \(a_i\) 对应的 \(b\) 的编号。

然后我们可以给出 \(ch\) 的代码。

bool ch(int x,int y)
{return fa[a[x].id]!=b[y].id&&x>0&&y>0;
}

每次修改的时候对于修改的两个位置 \(x,y\) 我们直接交换 \(fa_x\)\(fa_y\) 即可。

然后这道题就结束了。

提交记录

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

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

相关文章

题解:AT_abc204_e [ABC204E] Rush Hour 2

LG变形的 dijkstra。 先思考什么情况下需要等待以及等待多长时间最优。我们把题目上的计算方法按照当前的时间 \(t\) 和通过所需的时间 \(f(t)\) 列个函数关系: \[f(t)=t+c+\lfloor \frac{d}{t+1}\rfloor \]然后用 Desmos 画个图可以得到图像(其实就是对勾函数):因为 \(c,d…

Rust字符串类型全解析

字符串是每种编程语言都绕不开的类型, 不过,在Rust中,你会看到远比其他语言更加丰富多样的字符串类型。 如下图:为什么Rust中需要这么多种表示字符串的类型呢? 初学Rust时,可能无法理解为什么要这样设计?为什么要给使用字符串带来这么多不必要的复杂性? 其实,Rust中对…

AI自动生成代码注释

在vscode 中安装 TONGYI Lingma

通过 Tampermonkey 实现学习通全自动刷课

本文介绍了如何使用 Tampermonkey 这一流行的用户脚本管理器,通过其脚本库实现学习通的全自动刷课。文章详细讲解了 Tampermonkey 的安装步骤、OCS 脚本的配置方法,以及题库的使用流程,帮助读者高效完成学习任务。在学习过程中,自动化工具能大大提升学习效率。Tampermonkey…

KBU1010-ASEMI单向整流桥KBU1010

KBU1010-ASEMI单向整流桥KBU1010编辑:ll KBU1010-ASEMI单向整流桥KBU1010 型号:KBU1010 品牌:ASEMI 封装:KBU-4 批号:2024+ 类型:单向整流桥 电流(ID):10A 电压(VF):1000V 安装方式:直插式封装 特性:大功率、整流扁桥 产品引线数量:4 产品内部芯片个数:4 产品内部…

Kubernetes中Ingress的原理和配置

Ingress的概念和作用 Ingress是Kubernetes集群中的一个对象,用于将外部流量路由到集群内部的服务。它充当了进入Kubernetes集群的API网关,负责接收外部请求,并将其转发到正确的目标服务上。 Ingress通常通过HTTP和HTTPS提供对服务的访问,并支持基于主机名、路径以及其他HTT…

《如 何 速 通 一 套 题》4.0

A sprial 找规律。直接做。 #include <bits/stdc++.h> #define int long long using namespace std;int t, n;int sqrtll(int n) {int l = 1, r = 1000000, ans = 0;for(; l <= r; ) {int mid = (l + r) >> 1;if(mid * mid >= n) {ans = mid, r = mid - 1;}e…