HDU 4911 Inversion 解题报告(逆序数)
2014-08-05 20:24
423 查看
Inversion
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 261 Accepted Submission(s): 112
[align=left]Problem Description[/align]
bobo has a sequence a1,a2,…,an. He is allowed to swap two
adjacent numbers for no more than k times.
Find the minimum number of inversions after his swaps.
Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and ai>aj.
[align=left]Input[/align]
The input consists of several tests. For each tests:
The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).
[align=left]Output[/align]
For each tests:
A single integer denotes the minimum number of inversions.
[align=left]Sample Input[/align]
3 1
2 2 1
3 0
2 2 1
[align=left]Sample Output[/align]
1
2
[align=left]Author[/align]
Xiaoxu Guo (ftiasch)
[align=left]Source[/align]
2014 Multi-University Training Contest 5
解题报告:求逆序数inv,输出max(inv-k, 0)即可。这里用线段树求逆序数。代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <map> #include <set> #include <string> #include <iomanip> using namespace std; #define ff(i, n) for(int i=0;i<(n);i++) #define fff(i, n, m) for(int i=(n);i<=(m);i++) #define dff(i, n, m) for(int i=(n);i>=(m);i--) #define bit(n) (1LL<<(n)) typedef long long LL; typedef unsigned long long ULL; const LL inf=1e15; void work(); int main() { #ifdef ACM freopen("input.in", "r", stdin); #endif // ACM work(); } /***************************************************/ #define lson l, m, pos<<1 #define rson m+1, r, pos<<1|1 #define defm int m = (l+r)/2; const int maxn = 111111; int num[111111]; int yy[111111]; int n, k; LL sum[maxn << 2]; void updateFather(int pos) { sum[pos] = sum[pos<<1] + sum[pos<<1|1]; } void update(int p, int l, int r, int pos) { if(l == r) { sum[pos]++; return; } defm; if(p <= m) update(p, lson); else update(p, rson); updateFather(pos); } LL query(int L, int R, int l, int r, int pos) { if(L<=l && r<=R) return sum[pos]; defm; return (L<=m?query(L, R, lson):0) + (m<R?query(L, R, rson):0); } void work() { while(scanf("%d%d", &n, &k) == 2) { ff(i, n) scanf("%d", num + i); memcpy(yy, num, sizeof(num)); sort(yy, yy+n); int tot = unique(yy, yy+n) - yy; LL ans = 0; memset(sum, 0, sizeof(sum)); ff(i, n) { int pos = lower_bound(yy, yy+tot, num[i]) - yy; ans += query(pos+1, tot, 0, tot, 1); update(pos, 0, tot, 1); } cout << max(ans - k, 0LL) << endl; } }
相关文章推荐
- 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)
- hdu 4911 Inversion 多校第五场 求逆序数
- hdu 4911 Inversion 树状数组求逆序数对
- hdu 4911 Inversion (逆序数变换)
- HDU 4911 Inversion 树状数组求逆序数对
- hdu 4911 Inversion (多校第5场,求逆序数对,离散化)
- hdu 1394 解题报告 Minimum Inversion Number
- HDU 4911 Inversion(归并排序求逆序数)
- HDU 1394 Minimum Inversion Number解题报告
- HDU 4911 Inversion - 疯狂的癫子 解题心得
- HDU 4911 Inversion 求逆序数对
- hdu 4911 Inversion (分治 归并排序 求逆序数)
- hdu 4911 Inversion(求逆序数)
- HDU 4911 Inversion 树状数组求逆序数对
- hdu 1394 解题报告 Minimum Inversion Number
- 【树状数组】hdu 4911 Inversion(离散化+树状数组求逆序数)
- HDU 1587 Flowers 解题报告
- HDU 1066 解题报告 详细思路+code
- hdu 1064 解题报告
- HDU 2680 Choose the best route 解题报告