hdu1394(枚举/树状数组/线段树单点更新&区间求和)
2017-06-11 10:41
204 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
题意:给出一个循环数组,求其逆序对最少为多少;
思路:对于逆序对: 交换两个相邻数,逆序数 +1 或 -1, 交换两个不相邻数 a, b, 逆序数 += 两者间大于 a 的个数 - 两者间小于 a 的个数;
所以只要求出初始时的逆序对数,就可以推出其余情况时的逆序对数.对于求初始逆序对数,这里 n 只有 5e3,可以直接暴力 / 树状数组 / 线段树 / 归并排序;
代码:
1.直接暴力
View Code
题意:给出一个循环数组,求其逆序对最少为多少;
思路:对于逆序对: 交换两个相邻数,逆序数 +1 或 -1, 交换两个不相邻数 a, b, 逆序数 += 两者间大于 a 的个数 - 两者间小于 a 的个数;
所以只要求出初始时的逆序对数,就可以推出其余情况时的逆序对数.对于求初始逆序对数,这里 n 只有 5e3,可以直接暴力 / 树状数组 / 线段树 / 归并排序;
代码:
1.直接暴力
1 #include <iostream> 2 #include <stdio.h> 3 #define lson l, mid, rt << 1 4 #define rson mid + 1, r, rt << 1 | 1 5 using namespace std; 6 7 const int MAXN = 5e3 + 10; 8 int sum[MAXN << 2], a[MAXN]; 9 10 void push_up(int rt){ 11 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; 12 } 13 14 void build(int l, int r, int rt){ 15 sum[rt] = 0; 16 if(l == r) return; 17 int mid = (l + r) >> 1; 18 build(lson); 19 build(rson); 20 } 21 22 void update(int p, int x, int l, int r, int rt){ 23 if(l == r){ 24 sum[rt] += x; 25 return; 26 } 27 int mid = (l + r) >> 1; 28 if(p <= mid) update(p, x, lson); 29 else update(p, x, rson); 30 push_up(rt); 31 } 32 33 int query(int L, int R, int l, int r, int rt){ 34 if(l >= L && r <= R) return sum[rt]; 35 int mid = (l + r) >> 1; 36 int ans = 0; 37 if(L <= mid) ans += query(L, R, lson); 38 if(R > mid) ans += query(L, R, rson); 39 return ans; 40 } 41 42 int main(void){ 43 int n, ans = 0; 44 while(~scanf("%d", &n)){ 45 ans = 0; 46 build(0, n-1, 1); 47 for(int i = 0; i < n; i++){ 48 scanf("%d", &a[i]); 49 ans += query(a[i], n - 1, 0, n - 1, 1); 50 update(a[i], 1, 0, n - 1, 1); 51 } 52 int cnt = ans; 53 for(int i = 0; i < n; i++){ 54 cnt += (n - a[i] - 1) - a[i]; 55 ans = min(ans, cnt); 56 } 57 printf("%d\n", ans); 58 } 59 return 0; 60 }
View Code
相关文章推荐
- HDU4262–Juggler(区间求和&&单点更新)
- 线段树区间更新&&求和poj3486
- hdu1166(线段树单点更新&区间求和模板)
- 更新节点区间求和-&nbsp;HDU&nbsp;1166&nbsp;敌兵…
- poj3468(线段树区间更新&区间求和模板)
- nyoj 116 士兵杀敌(二) 【线段树】区间求和&&节点更新
- HDU1394 - Minimum Inversion Number(单点增减&&区间求和)
- poj 3468 A Simple Problem with Integers(线段树,区间更新&求和)
- hdoj 1166 敌兵布阵 【线段树(区间求和&&更新节点)】
- HDOJ 4614 —— 线段树区间更新&区间求和
- Poj 3468 A Simple Problem with Integers (线段树 区间更新 区间求和)
- HDU1754 - I Hate It(单点更新&区间查询)
- HDU3397 - Sequence operation(区间更新&&区间合并)
- hdu 3874 Necklace 线段树单点更新区间求和
- hdu 3911-区间合并、更新和查询Black And White (&& hdu 1199)
- poj-3468 线段树和树状数组的区间更新及求和
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- POJ 3468 A Simple Problem with Integers(线段树区间更新+求和)
- Wiki OI 1082 线段树练习 3 (区间更新,区间求和)
- hdu1166(单点更新,区间求和)