URAL

来源:互联网 发布:淘宝买东西货到付款 编辑:程序博客网 时间:2024/06/07 01:16
题意:
有 k 行士兵,每行 n 个人,求得每一行逆序对数,输出最大的那一行的行标,逆序对数相同输出标号最小的
这里用 树状数组求逆序对数(对于每个数,他前面出现的比他大的个数)
归并排序也可以求逆序对,可以自行补充



#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e4 + 7, maxd = 20 + 7, mod = 1e9 + 7;const int INF = 0x7f7f7f7f;int n, k, a[maxd][maxn], bit[maxn];int lowbit(int x) {    return x & -x;}void add(int x, int t) {    for(int i = x; i <= n; i += lowbit(i)) {        bit[i] += t;    }}int sum(int x) {    int res = 0;    for(int i = x; i > 0; i -= lowbit(i)) {        res += bit[i];    }    return res;}int main() {    scanf("%d %d", &n, &k);    int max_ = 0, ans = 1;    for(int i = 0; i < k; ++i) {        memset(bit, 0, sizeof bit);        int cnt = 0;        for(int j = 0; j < n; ++j) {            scanf("%d", &a[i][j]);            cnt += (j - sum(a[i][j]));            add(a[i][j], 1);        }        if(cnt > max_) { max_ = cnt; ans = i+1; }    }    cout << ans << endl;    return 0;}


原创粉丝点击