Bootstrap

Codeup100000636问题 C: Count Inversions

题目描述:

给一个数组,算inverted pair的数目

输入:

有多组测试样例。每组输入数据占一行,每一行是一个数组,数组之间的元素用空格分开

输出:

每组输出结果占一行。对应于每组输入数据的inversions

样例输入:

1 2 3
2 1 3
3 2 1

样例输出:

0
1
3

实现代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lowbit(i) ((i)&(-i))

const int maxn = 1000;
int n;
int c[maxn];
int A[maxn];

void update(int x, int v,int maxNum) {
    for(int i = x; i <= maxNum; i += lowbit(i)) {
        c[i] += v;
    }
}

int getSum(int x) {
    int sum = 0;
    for(int i = x; i > 0; i -= lowbit(i)) {
        sum += c[i];
    }
    return sum;
}

int strToNum(string s, int &maxNum) {
    int num = 0;
    int temp = 0;
    for(int i = 0; i < s.size(); i++) {
        if(s[i] >= '0' && s[i] <= '9') {
            temp = temp * 10 + s[i] - '0';
        } else {
            A[num++] = temp;
            if(maxNum < temp) {
                maxNum = temp;
            }
            temp = 0;
        }
    }
    A[num++] = temp;
    if(maxNum < temp) {
        maxNum = temp;
    }
    return num;
}

int main() {
    string s;
    while(getline(cin, s)) {
        memset(c, 0, sizeof(c));
        memset(A, 0, sizeof(A));
        int maxNum = 0;
        int num = strToNum(s, maxNum);
        long long sum = 0;
        for(int i = 0; i < num; i++) {
            update(A[i], 1,maxNum);
            sum += getSum(maxNum) - getSum(A[i]);
        }
        printf("%lld\n", sum);
    }
    return 0;
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;