使用并查集 + 树状数组(逆序对统计)。
划分锚点块:将每条锚点边视为一个并查集节点。如果两条边的原稿端点相同,或者修订端点相同,就合并它们。最终每个集合对应一个锚点块,没有锚点的段落自动被忽略。
求代表下标:遍历所有边,找到所属集合,分别记录该集合中最小的原稿下标和修订下标。
构造序列:将所有锚点块按照修订代表下标升序排序,提取对应的原稿代表下标,得到序列。
校对系统把原稿与修订稿的段落用若干锚点边连起来,用来刻画两侧段落之间的对应。
两侧的对应不一定是一对一:某一段原稿可能挂到多段修订稿,多段原稿也可能共同挂到同一段修订稿。把每条锚点边看成连接「一段原稿」与「一段修订稿」的边,得到一张二分图。图中至少含一条锚点边的连通分量称为一个锚点块;没有任何锚点的孤立段落不构成锚点块,也不参与后续统计。
对每个锚点块定义:
将所有锚点块按修订代表下标升序排成一列,得到它们的原稿代表下标序列。把这条序列用相邻对换调整成严格递增时,所需的最少次数,就是本题要求的答案(它刻画修订稿相对原稿的错位程度)。
第一行一个整数 e,表示锚点边条数。
第二行两个整数 p,q,分别表示原稿段落数与修订稿段落数。
第三行 e 个整数 u1,u2,…,ue,表示每条边的原稿端点。
第四行 e 个整数 v1,v2,…,ve,表示每条边的修订稿端点。
保证第 t 条边连接原稿第 ut 段与修订稿第 vt 段(1≤ut≤p,1≤vt≤q)。
输出一个整数,即把上述原稿代表序列调整为递增所需的最少相邻对换次数。
输入
3
3 3
1 2 3
2 3 1
输出
2
说明
三条边形成三个一对一锚点块。按修订代表升序,原稿代表序列为 [3,1,2],最少相邻对换 2 次。
输入
4
3 4
1 1 2 3
1 2 4 3
输出
1
说明
原稿段 1 同时挂到修订段 1 与 2;另外两条边各自单独成块。按修订代表升序得到序列 [1,3,2],最少对换 1 次。
输入
3
5 4
1 2 4
2 2 1
输出
1
说明
原稿 1、2 共同连到修订 2(多对一);原稿 4 连到修订 1;原稿 3、5 与修订 3、4 无锚点,不参与。按修订代表升序得到序列 [4,1],最少对换 1 次。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册