题目链接:http://codeforces.com/contest/1269/problem/E
Codeforces 1269E. K Integers
题目大意
给定一个1到n的排列,定义一个移动操作为:交换相邻的两个元素。
现在定义一个函数f(x),表示在原排列中,通过交换操作,形成一个1,2,3....x的排列的子串,需要的最小操作步骤。
子串意味着这个排列必须是相邻的。
现在你需要求出f(1),f(2),f(3)......f(n)。
思路
我们考虑相邻的情况。
ans{1 2 3}=0
ans{1 3 2}=1;
ans{2 1 3}=1;
ans{3 2 1}=3;
ans{3 1 2}=2;
ans{4 1 2 3}=3;
。。。
我们发现,在元素相邻的情况下,答案一定是与逆序对有关的(因为最后排列不存在逆序对),并且每一次操作都可以消除一对逆序对,所以,相邻的答案就是逆序对的个数。
现在考虑不相邻的情况,如何移动才能使操作步数最少呢?答案应该是先将i个元素移动到一块儿,变成相邻的情况,再交换逆序对,这样才是最优的,因为这样操作,对于中间的每个不是当前排列的元素,他只会越来越