nyoj117求逆序数(离散化+树状数组/归并排序)
来源:互联网 发布:有软件卸载不了 编辑:程序博客网 时间:2024/05/14 00:47
题目链接:nyoj117
树状数组思路:
首先将输入的数组离散化,使各个元素比较接近,而不是离散的。
离散时用一个结构体,val表示原来输入的数,pos表示下标;接着对结构体按val的大小排序,此时,val和结构体的下标就是一个一一对应的关系,而且满足原来的大小关系。然后用数组reflect存储原来所有的大小信息。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N = 1000005;int reflect[N],c[N],n;struct node{ int val; int pos;}s[N];bool cmp(node x,node y){ if(x.val == y.val) return x.pos < y.pos; return x.val < y.val;}int lowbit(int x){ return x&(-x);}void update(int x){ while(x <= n) { c[x] += 1; x += lowbit(x); }}long long getsum(int x)//统计比x小的数{ long long sum = 0; while(x > 0) { sum += c[x]; x -= lowbit(x); } return sum;}int main(){int T,i;scanf("%d",&T);while(T--){ scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&s[i].val), s[i].pos = i; sort(s+1,s+n+1,cmp); for(i = 1; i <= n; i ++) reflect[s[i].pos] = i; memset(c,0,sizeof(c)); long long ans = 0; for(i = 1; i <= n; i ++) { update(reflect[i]); ans += i - getsum(reflect[i]);//i表示已经插入的数的个数 } printf("%lld\n",ans);}return 0;}
#include<stdio.h>int a[1000005],temp[1000005];long long sum;void merge(int left,int mid,int right){int i = left,j = mid + 1;int k = left;while(i <=mid && j <= right){if(a[i] <= a[j])temp[k ++] = a[i ++];else{temp[k ++] = a[j ++];sum += mid - i + 1;//关键}}while(i <= mid) temp[k ++] = a[i ++];while(j <= right) temp[k ++] = a[j ++];for(i = left ; i <= right; i ++)a[i] = temp[i];}void msort(int left,int right){if(left < right){int mid = (left + right) >> 1;msort(left,mid);msort(mid + 1,right);merge(left,mid,right);}}int main(){int i,n,T;scanf("%d",&T);while(T--){ scanf("%d",&n);for(i = 0;i < n; i ++)scanf("%d",&a[i]); sum = 0;msort(0,n - 1);printf("%lld\n",sum);}return 0;}
- nyoj117求逆序数(离散化+树状数组/归并排序)
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- 树状数组(归并排序) 之 求逆序数nyoj117
- NYOJ117-求逆序数(归并排序)
- nyoj117 求逆序数 归并排序
- nyoj117 求逆序数 归并排序
- NYOJ117&& 树状数组求逆序数
- 求逆序数模板(树状数组+离散化 || 归并排序法)
- 南阳117求逆序数(离散化+树状数组或归并排序)
- poj2299Ultra-QuickSort【树状数组求逆序数、离散化】、【归并排序模板】
- 归并排序&&树状数组求逆序数
- 归并排序 树状数组 求逆序数
- 逆序数--归并排序-nyoj117
- 离散化+树状数组求逆序数
- 树状数组离散化求逆序数
- 树状数组+ 离散化 求逆序数
- nyoj117——用归并排序求逆序数
- NYOJ117 求逆序数(归并排序记录次数)
- OC之【NSMutableDictionary的使用】
- 固定资产更新接口
- C++this指针
- git(6)
- LeetCode Reverse Integer
- nyoj117求逆序数(离散化+树状数组/归并排序)
- 菜鸟学JAVA之JFrame
- git(7)
- 基于软件开源实践(FLOSS)论共产主义的可实现性
- OC之【NSNumber的使用】
- Mac shell 颜色配置
- git(8)
- observer pattern
- java历史