P1039翻转字符flip

时间限制 1000 ms内存限制 512 MiB通过率 —
显示算法标签字符串 · 线段树 · 逆序对

【题目背景】

Celia 在整理航海日志时,发现一条字符带被镜像装置倒置了。字符没有遗失,只是顺序完全相反,Celia 需要用装置仅有的交换功能将它恢复。

翻转字符插图

【题目描述】

给定一个长度为 nn、只包含小写英文字母的字符串 AA。将 AA 中的字符顺序完全翻转后得到字符串 BB

一次相邻交换可以选择字符串中两个相邻的字符,并交换它们的位置。

请你求出至少需要进行多少次相邻交换,才能将字符串 BB 变为字符串 AA

【输入格式】

从文件 flip.in\textbf{\textit{flip.in}} 中读入数据。

输入的第一行包含一个非负整数 cc,表示测试点编号。c=0c=0 表示该测试点为样例。

第二行包含一个正整数 nn,表示字符串的长度。

第三行包含一个长度为 nn 的字符串 AA,保证其中只含小写英文字母。

【输出格式】

输出到文件 flip.out\textbf{\textit{flip.out}} 中。

输出一行一个整数,表示将字符串 BB 变为字符串 AA 所需的最少相邻交换次数。

【样例 1 输入】

05aaaza

【样例 1 输出】

2

【样例 2 输入】

06cbaabc

【样例 2 输出】

0

【样例 3 输入】

09icpcsguru

【样例 3 输出】

30

【说明/提示】

【样例 1 解释】

字符串 BBazaaa。将字符 z 连续向右交换两次即可得到 aaaza,因此答案为 22

【样例 2 解释】

字符串 AA 翻转后仍为 cbaabc,无需进行操作。

【样例 3 解释】

无论采用何种操作顺序,都至少需要进行 3030相邻交换。存在一种操作方案恰好使用 3030 次操作。

【样例 4】

见选手目录下的 flip/flip4.in\textbf{\textit{flip/flip4.in}}flip/flip4.ans\textbf{\textit{flip/flip4.ans}}

该组样例符合测试点 121\sim 2 的数据范围。

【样例 5】

见选手目录下的 flip/flip5.in\textbf{\textit{flip/flip5.in}}flip/flip5.ans\textbf{\textit{flip/flip5.ans}}

该组样例符合测试点 353\sim 5 的数据范围。

【样例 6】

见选手目录下的 flip/flip6.in\textbf{\textit{flip/flip6.in}}flip/flip6.ans\textbf{\textit{flip/flip6.ans}}

该组样例符合测试点 6106\sim 10 的数据范围。

【样例 7】

见选手目录下的 flip/flip7.in\textbf{\textit{flip/flip7.in}}flip/flip7.ans\textbf{\textit{flip/flip7.ans}}

该组样例符合测试点 6106\sim 10 的数据范围。

【数据范围】

对于全部测试数据,保证 2n2×1052\leq n\leq 2\times 10^5

测试点编号nn
121\sim 210\leq 10
353\sim 52×103\leq 2\times 10^3
6106\sim 102×105\leq 2\times 10^5

【题解】

已公开 1 篇题解,官方题解会优先显示。

查看题解