树状数组求逆序数:
相当于一个标记的思想,用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;
}