hdu 1394 Minimum Inversion Number
2013-10-27 19:15
295 查看
事实上就是求每个排列的逆序数,找出最小的那个,所以求逆序数算法需要得到优化。 由于数组的数各不相同,所以我们可以只需要求得初始 数组的逆序数就可以了,其他的可以递推出来: 10 1 3 6 9 0 8 5 7 4 2 开始的逆序数为22, 那么将1移到后面后得到的是: 3 6 9 0 8 5 7 4 2 1 对于这个新的排列,你会发现这个排列的逆序数很奇怪: 实际上1的逆序数置为0, 而大于1的每个数的逆序数都要加1, 而1的逆序数就是小于1的数的个数, 所以你就会得到每移一个数需要减去小于这个数的数的个数,再加上大于这个数的数的个数 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <stack> #include <queue> #include <cstdio> #include <cstdlib> #include <cmath> #include <set> #include <vector> #include <cstring> #include <algorithm> #define INF 0x3fffffff #define N 5010 #define M (N << 2) #define LL long long #define mod 95041567 using namespace std; struct Node{ int set; int sum; int l, r; }; int p , t , q ; int maintain(int l, int r){ int v = 0; int mid = (r - l) / 2 + l; for(int i = l, j = mid + 1; i <= mid; ++ i) for(; j <= r + 1; ++ j) if(j == r + 1 || p[j] >= p[i]){ v += j - mid - 1; break; } int k = 0; for(int i = l, j = mid + 1; i + j < r + mid + 2; ) if(j <= r && (i > mid || p[i] > p[j])) t[k ++] = p[j ++]; else if(i <= mid && (j > r || p[i] <= p[j])) t[k ++] = p[i ++]; for(int i = 0; i < k; ++ i) p[l ++] = t[i]; return v; } int update(int l, int r){ if(r <= l) return 0; int mid = (r - l) / 2 + l; int v = update(l, mid); v += update(mid + 1, r); v += maintain(l, r); return v; } int main() { // freopen("in.txt", "r", stdin); int n; while(scanf("%d", &n) != EOF){ for(int i = 0; i < n; ++ i){ scanf("%d", &p[i]); q[i] = p[i]; } int v = update(0, n - 1); int cnt = v; for(int i = 0; i < n; ++ i) v = min(cnt += n - q[i] - q[i] - 1, v); printf("%d\n", v); } return 0; }
相关文章推荐
- hdu 1394 Minimum Inversion Number(树状数组)
- hdu1394 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 【单节点+逆序数】
- HDU1394 Minimum Inversion Number(线段树单点更新,暴力,逆序数)
- Hdu 1394 Minimum Inversion Number
- Minimum Inversion Number----HDU_1394----线段树之单点更新
- 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 1394 Minimum Inversion Number(逆序对数+线段树)
- HDU 1394- Minimum Inversion Number(线段树求逆序数)
- HDU 1394 Minimum Inversion Number 线段树
- hdu 1394 Minimum Inversion Number(线段树求逆序数)