您的位置:首页 > 大数据 > 人工智能

URAL - 1090 D - Inverse Order Pair——线段树求逆序数

2017-11-07 12:34 316 查看
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;

int n, k, a[maxn], ans[maxn], res;

struct Tree {
int data[maxn<<1];
void init() { memset(data, 0, sizeof(data)); }
void pushup(int root) { data[root] = data[root<<1] + data[root<<1|1]; }
void updata(int l, int r, int root, int pos) {
if (l == r) { data[root] += 1; return; }
int mid = (l + r)>>1;
if (pos <= mid) updata(l, mid, root<<1, pos);
else updata(mid + 1, r, root<<1|1, pos);
pushup(root);
}
int query(int l, int r, int root, int ql, int qr) {
if (ql <= l && r <= qr) { return data[root]; }
int mid = (l + r)>>1;
int ans = 0;
if (ql <= mid) ans += query(l, mid, root<<1, ql, qr);
if (mid < qr) ans += query(mid + 1, r, root<<1|1, ql, qr);
return ans;
}
}tree;

int main() {
while (~scanf("%d %d", &n, &k)) {
res = 0;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= n; j++) scanf("%d", &a[j]);
tree.init();
int sum = 0;
for (int j = n; j >= 1; j--) {
sum += tree.query(1, n, 1, 1, a[j]);
tree.updata(1, n, 1, a[j]);
}
ans[i] = sum;
res = max(res, sum);
}
for (int i = 1; i <= k; i++) {
if (ans[i] == res) {
printf("%d\n", i); break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: