URAL

来源:互联网 发布:营销网络地图代码 编辑:程序博客网 时间:2024/05/17 23:21

题目链接

树状数组求逆序数:

相当于一个标记的思想,用1来标记每一个位置

某一位置的逆序数不就是这个位置的坐标减去他前面出现的数字(因为他前面出现的一定是比它小的,而且还是被标记了,一定符合标准)

同时还要注意初始的比较值!!

Code:

//#include<bits/stdc++.h//树状数组求逆序对//错了非常多遍,今天才该对,原来凶手竟然是-1//如果每一个的逆序对数都是0,那么按照我的程序的输出就是0了//不符合条件,应该一开始的初值为-1//这也同时提醒了!!初始值一定要设置成一个取不到的值#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 10005;int c[maxn];int a[maxn];int n;int lowbit(int i){    return i & (-i);}void add(int i, int x){    while(i <= n)    {        c[i] += x;        i += lowbit(i);    }    return ;}int sum(int i){    int s = 0;    while(i > 0)    {        s += c[i];        i -= lowbit(i);    }    return s;}int solve(){    int ans = 0;    for(int j = 0; j < n; j++)   //j从0开始变化    {        ans += j - sum(a[j]);    //因为标记元素为0和1,如果从1开始计数,就会多一个        add(a[j], 1);    }    return ans;}int main(){    int K;    scanf("%d %d", &n, &K);    int kase, pos = 0, maxx = -1;    for(kase = 1; kase <= K; kase++)    {        memset(a, 0, sizeof(a));        memset(c, 0, sizeof(c));        for(int i = 0; i < n; i++)            scanf("%d", &a[i]);        int ans = solve();        if(maxx < ans)            maxx = ans, pos = kase;    }    cout << pos << endl;    return 0;}


有志, 有识, 有恒 !!奋斗

原创粉丝点击