您的位置:首页 > 其它

soj 2309: In the Army Now (树状数组求逆序数)

2015-11-01 16:27 441 查看
@(K ACMer)

题意:

可以发现就是求逆序数最大的哪一行

分析:

树状数组,求逆序数是非常经典的用法,当然归并排序的思想也可以来求.

每次新来一个数x我们就
add(x , 1);
这样维护数组数组
sum[i]
就表示在该数左边小于等于它的数的个数.
j - sum[i]
就是大于它的个数了.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <string>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e4 + 40;
int bit[maxn], m, n;

int sum(int i) {
int s = 0;
while (i > 0) {
s += bit[i];
i -= i & -i;
}
return s;
}

void add(int i, int x) {
while (i <= n) {
bit[i] += x;
i += i & -i;
}
}

int main(void) {
while (~scanf("%d%d", &m, &n)) {
int ans = -1, row;
for (int i = 0; i < m; i++) {
for (int j = 0; j <= n; j++)
bit[j] = 0;
int sums = 0;
for (int j = 0; j < n; j++) {
int x;
scanf("%d", &x);
sums += j - sum(x);
add(x, 1);
}
if (sums > ans) {
row = i + 1;
ans = sums;
}
}
printf("%d\n", row);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组