HDU5122(树状数组)

来源:互联网 发布:数据库基础面试题 编辑:程序博客网 时间:2024/05/01 09:54

水水的树状数组,求冒泡排序以后所有需要冒泡的数的个数。

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <vector>#include <queue>using namespace std;#define maxn 1111111#define maxm 121111#define INF 1000000000struct node {    int num, pos;} a[maxn];int n, c[maxn];bool cmp1 (const node &a, const node &b) {    return a.num < b.num;}int lowbit (int x) {    return x&(-x);}void update (int pos) {    if (pos <= 0)        return ;    for (int i = pos; i > 0; i -= lowbit (i)) {        c[i] += 1;    }}int sum (int pos) {    int ans = 0;    for (int i = pos; i <= n; i += lowbit (i)) {        ans += c[i];    }    return ans;}int main () {    int t, kase = 0;    scanf ("%d", &t);    while (t--) {        scanf ("%d", &n);        memset (c, 0, sizeof c);        for (int i = 1; i <= n; i++) {            scanf ("%d", &a[i].num);            a[i].pos = i;        }        sort (a+1, a+1+n, cmp1);        int ans = 0;        for (int i = 1; i <= n; i++) {            if (sum (a[i].pos))                ans++;            update (a[i].pos);        }        printf ("Case #%d: %d\n", ++kase, ans);    }    return 0;}


0 0
原创粉丝点击