P1966 [NOIP2013 提高组] 火柴排队 (树状数组

#include 
//using int_max = 0x3f3f3f3f;
#define long_max 9223372036854775807;
using namespace std;
typedef long long ll;
typedef pair PII;
typedef pair PDD;
using VI = vector;
typedef unsigned long long ull;
const int mod = 1e8 - 3;
PII a[500050];
PII b[500050];
int q[500050];
int tree[500050];
int n;

int lowbit(int x){
    return x & (-x);
}
int quary(int pos){

    int res = 0;
    for(int i = pos; i ;i -= lowbit(i)){
        res += tree[i];
    }
    return res;
}
void change(int pos,int x){

    for(int i = pos;i <= n;i += lowbit(i)){
        tree[i] += x;
    }

}





int main() {
   cin>>n;
   for(int i = 1;i <= n;i++){
       int x;
       cin>>x;
       a[i] = {x,i};
   }
    for(int i = 1;i <= n;i++){
        int x;
        cin>>x;
        b[i] = {x,i};
    }
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    for(int i = 1;i <= n;i++){
        q[a[i].second] = b[i].second;
    }
    int res = 0;
    for(int i = 1;i <= n;i++){
        change(q[i] , 1);
        res += i - quary(q[i]);
        res = res % mod;
    }

    cout<

本质上是个树状数组求逆序对,但是怎么弄确实很难想

先离散化成 1 , 2 , 3, 4, 5 , n

q[i] = j 表示a的第i个数 和 b的第j个数相等

通过调整b的位置 j1  j 2  q[i1] = j2    q[i2] = j1;

最终使q[i] = i;

这就是以a作为索引排序b

你可能感兴趣的:(数据结构题,算法,c++,数据结构)