特殊的离散化处理 特殊的离散化处理 特殊的离散化处理
按照给定数组的大小关系求出它的索引数组
即 索引数组中的val值是原数组第key大的数字所在的下标
#include
#include
#include
using namespace std;
const int N = 1e5;
int n;
int a[N], b[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
b[i] = i;
}
sort(b+1, b+1+n, [](int x, int y){
return a[x] == a[y] ? x > y : a[x] > a[y];
});
for(int i = 1; i <= n; i ++)
{
printf("%d ", b[i]);
}
return 0;
}
这样我们就要用索引数组来操作了 这样我们就要用索引数组来操作了 这样我们就要用索引数组来操作了
还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如 5 进去了就求 1 − − 4 的前缀和就是正序对数,最终的正序对数就是逆序对 还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如5进去了就求1--4的前缀和就是正序对数,最终的正序对数就是逆序对 还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如5进去了就求1−−4的前缀和就是正序对数,最终的正序对数就是逆序对
#include
#include
#include
using namespace std;
const int N = 1e5;
int n;
int a[N], b[N], c[N];
int lowbit(int x)
{
return x & -x;
}
void add(int x)
{
for(int i = x; i <= n; i += lowbit(i))
{
c[i] += 1;
}
}
int query(int x)
{
int res = 0;
for(int i = x; i > 0; i-= lowbit(i))
{
res += c[i];
}
return res;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
b[i] = i;
}
sort(b+1, b+1+n, [](int x, int y){
return a[x] == a[y] ? x > y : a[x] > a[y];
});
int res = 0;
for(int i = 1; i <= n; i ++)
{
res += query(b[i]);
add(b[i]);
}
cout << res << endl;
return 0;
}