HDU2689 Sort it (树状数组|水题)

来源:互联网 发布:国家开放大学 网络教育 编辑:程序博客网 时间:2024/04/28 19:21

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2689


题意很好理解,在这里就不再赘述。

第一种解法:数据量较小,水过~

AC代码如下:

#include <cstdio>#include <cstring>using namespace std;const int maxn = 1005;int a[maxn],n;int main(){while(~scanf("%d",&n)){for(int i = 0; i < n; i ++){scanf("%d",&a[i]);}int ans = 0;for(int i = 0; i < n; i ++){for(int j = i + 1; j < n; j ++){if(a[i] > a[j])ans ++;}}printf("%d\n",ans);}return 0;}

第二种解法:树状数组求逆序数,时间复杂度nlogn

AC代码如下:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;struct node{int pos,val;}p[maxn];int tree[maxn],n,in[maxn];bool cmp(node A, node B){return A.val > B.val;}int lowbit(int k){return k & -k;}void add(int k, int num){while(k <= maxn){tree[k] += num;k += lowbit(k);}}int read(int k){int sum = 0;while(k){sum += tree[k];k -= lowbit(k);}return sum;}int main(){while(~scanf("%d",&n)){for(int i = 1; i <= n; i ++){scanf("%d",&p[i].val);p[i].pos = i;}sort(p+1,p+n+1,cmp);for(int i = 1; i <= n; i ++){in[p[i].pos] = i;} int ans = 0;memset(tree,0,sizeof(tree));for(int i = 1; i <= n; i ++){ans += read(in[i]);add(in[i],1);}printf("%d\n",ans);}return 0;}


原创粉丝点击