URAL

来源:互联网 发布:ubuntu 新建文档 编辑:程序博客网 时间:2024/06/10 20:49
#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;}

原创粉丝点击