题目
https://vjudge.net/problem/POJ-2299
思路
求逆序对,做过类似的,看题解有三种方法,这里还是用树状数组来做吧,熟悉熟悉~
ps:这个奇奇怪怪的图跟题目有什么联系嘛
跟交换的次数的代码是一样的,,,,,,,,,,只是把空间改大了。。。。。
自己写的那个遇到了好多问题。。。。。还是思路不清晰造成的
代码
#include<iostream>
#include<utility>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 500500;
pair<int, int> a[maxn];
int n, c[maxn];
void add(int p, int v = 1)
{
for (; p <= n; p += p & -p) c[p] += v;
}
int ask(int x)
{
int cnt = 0;
for (; x; x -= x & -x) cnt += c[x];
return cnt;
}
int main()
{
while (cin >> n && n)
{
long long ans = 0;
for (int i = 1; i <= n; i++)
cin >> a[i].first;
a[i].second = i;
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++)
{
ans += ask(n) - ask(a[i].second);
add(a[i].second);
}
cout << ans << "\n";
memset(c, 0, sizeof(c));
}
}
总结
在这里可以看到pair的方便简洁之处,头文件是 #include
① 通过
a
[
i
]
.
f
i
r
s
t
;
a
[
i
]
.
s
e
c
o
n
d
=
i
;
a[i].first; a[i].second = i;
a[i].first;a[i].second=i; 访问元素
② 使用sort对pair进行排序
pair 默认对first升序,当first相同时对second升序
int cmp(pair<int,int>a,pair<int,int>b){
if(a.first!=b.first)return a.first>b.first;
else return a.second<b.second;
}