Codeforces 1269E. K Integers(逆序对,树状数组+二分)

题目链接:http://codeforces.com/contest/1269/problem/ECodeforces 1269E. K Integers题目大意给定一个1到n的排列,定义一个移动操作为:交换相邻的两个元素。现在定义一个函数f(x),表示在原排列中,通过交换操作,形成一个1,2,3....x的排列的子串,需要的最小操作步骤。子串意味着这个排列必须是相邻的。现...
摘要由CSDN通过智能技术生成

题目链接: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个元素移动到一块儿,变成相邻的情况,再交换逆序对,这样才是最优的,因为这样操作,对于中间的每个不是当前排列的元素,他只会越来越

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值