http://www.codechef.com/problems/LEBOBBLE
任何数组的冒泡排序n个整数中的一个按以下方式工作:
var int i, j;
for i from n downto 1
{
for j from 1 to i-1
{
if (A[j] > A[j+1])
swap(A[j], A[j+1])
}
}
您将获得一个n个整数的数组B.
然后使用数组B创建数组A,如下所示: 对于每个i(1 <= i <= n),我们用概率Pi设置Ai = Bi + d,否则Ai = Bi。 帮助Little Elephant找到当使用上述气泡排序算法对数组A进行排序时,气泡排序将产生的预期交换次数。 输入
输入的第一行包含单个整数T - 测试用例的数量。 T测试案例如下。每个测试用例的第一行包含一对整数n和d。每个测试用例的下一行包含n个整数 - 数组B.下一行包含n个整数 - 数组P. 输出在T行中打印T实数 - 相应测试用例的答案。请将所有数字四舍五入到小数点后的4位数。 约束
1 <= T <= 5
1 <= n <= 50000
1 <= Bi, d <= 10^9
0 <= Pi, <= 100
Example
Input:
2
2 7
4 7
50 50
4 7
5 6 1 7
25 74 47 99
Output:
0.2500
1.6049
您对如何处理此问题有任何提示吗?
答案 0 :(得分:2)
作为提示 - 冒泡排序中的交换次数等于数组中inversions的数量。有一种着名的分而治之的算法来计算数组在时间O(n log n)中的反转次数 - 你能想出如何做到这一点吗?
希望这有帮助!