HDU 4911 Inversion 树状数组求逆序数对
2014-08-05 17:29
399 查看
显然每次交换都能减少1
所以求出逆序数对数,然后-=k就好了。。。
_(:зゝ∠)_
所以求出逆序数对数,然后-=k就好了。。。
_(:зゝ∠)_
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<set> #include<map> #include<iostream> #include<algorithm> using namespace std; #define N 100005 #define ll long long ll c[N+100000], maxn; inline ll Lowbit(ll x){return x&(-x);} void change(ll i, ll x)//i点增量为x { while(i <= maxn) { c[i] += x; i += Lowbit(i); } } ll sum(ll x){//区间求和 [1,x] ll ans = 0; for(ll i = x; i >= 1; i -= Lowbit(i)) ans += c[i]; return ans; } ll a , n, k; set<ll>s; set<ll>::iterator p; map<ll,ll>mp; int main(){ ll i; while(cin>>n>>k){ s.clear(); mp.clear(); for(i = 1; i <= n; i++)scanf("%I64d",&a[i]), s.insert(a[i]); maxn = n+100; for(p = s.begin(), i = 2; p!=s.end(); p++, i++) { mp[*p] = i; } for(i = 1; i <= n; i++)a[i] = mp[a[i]]; memset(c, 0, sizeof c); ll ans = 0; for(i = n; i >= 1; i--) { ans += sum(a[i]-1); change(a[i], 1); } ans -= k; cout<< max(0ll, ans) <<endl; } return 0; }
相关文章推荐
- hdu 4911 Inversion 树状数组求逆序数对
- 【树状数组】hdu 4911 Inversion(离散化+树状数组求逆序数)
- HDU 4911 Inversion 树状数组求逆序数对
- hdu 1394 Minimum Inversion Number(树状数组求逆序数)
- hdu 1394 Minimum Inversion Number(树状数组求逆序数)
- HDU 4911 - Inversion(树状数组||归并排序)
- HDU - 4911 - Inversion(树状数组逆序数+离散化)
- 树状数组求正序数与逆序数-hdu Minimum Inversion Number
- hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)
- HDU 1394 Minimum Inversion Number (树状数组求逆序数)
- hdu 1394 Minimum Inversion Number (树状数组求逆序数)
- hdu 1394 Minimum Inversion Number 树状数组求逆序数对(原理)
- hdu 1394 Minimum Inversion Number(树状数组求逆序数)
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
- HDU 4911 Inversion(树状数组求逆序对数 + 数据离散化)
- hdu1394 Minimum Inversion Number(树状数组求逆序数)
- HDU 1394 - Minimum Inversion Number(树状数组求逆序数)
- 树状数组求正序数与逆序数-hdu Minimum Inversion Number
- hdu Minimum Inversion Number---树状数组求正序数与逆序数
- Inversion (hdu 4911 树状数组 || 归并排序 求逆序对)