hdu4911Inversion 树状数组求逆序对
2015-09-02 19:17
393 查看
//给一个序列 , 可以进行k次相邻元素的交换 , 问 //问交换后的序列最少有多少个逆序对 //很好想到没经过一次相邻的元素的交换 , 逆序对的个数都会剪一 //答案直接就是原来的序列的个数-k就行 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std ; const int maxn = 1e5+10 ; typedef long long ll ; int tree[maxn] ; int a[maxn] ; int b[maxn] ; int getsum(int x) { int sum = 0 ; while(x) { sum += tree[x] ; x -= x&(-x) ; } return sum ; } void update(int x , int dx) { while(x < maxn) { tree[x] += dx ; x += (x)&(-x) ; } } int main() { //freopen("in.txt" , "r" , stdin) ; int n , k ; while(~scanf("%d%d" , &n , &k)) { memset(tree , 0 , sizeof(tree)) ; for(int i = 1;i <= n;i++) scanf("%d" , &a[i]) , b[i] = a[i] ; sort(b+1 , b+1+n) ; int len = unique(b+1 , b+1+n) - (b+1) ; ll ans = 0 ; for(int i = 1;i <= n;i++) { int pos = lower_bound(b+1 , b+1+len , a[i]) - b ; update(pos , 1) ; ans += (i - getsum(pos)) ; } if(ans < k) puts("0") ; else cout<<(ans-k)<<endl; } }
相关文章推荐
- IOS开发技巧快速生成二维码
- iOS平台下的加密
- linux运维实战练习-正则表达式
- linux 环境命令行导出dmp文件
- IOS中UISearchController搜索框筛选功能实现
- mongodb基础操作
- 浅谈自己了解的安全方向发展
- 【面向对象】运算符重载、友元函数
- linux运维实战练习-正则表达式
- JSON对象转字符串
- mongo:Criteria和Query
- head命令
- 【面向对象】类和对象的基本概念
- RS232,RS485波形分析
- java中final static关键字用法
- uboot之Mkconfig分析
- WEB 学习基础部分
- 分治法求最近点对
- sort命令
- jsp输入框传值的问题,做个记录