题解:CF573D Bear and Cavalry

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

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

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

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

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

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

dpi=max{dpi1+aibich(i,i)dpi2+aibi1+ai1bich(i,i1) and ch(i1,i)dpi3+aibi2+ai2bi1+ai1bich(i2,i1) and ch(i1,i) and ch(i,i2)dpi3+biai2+bi2ai1+bi1aich(i2,i) and ch(i,i1) and ch(i1,i2)

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

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

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

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

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

然后这道题就结束了。

提交记录

posted @   Redamancy_Lydic  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示