树状数组10pt求助
查看原帖
树状数组10pt求助
906856
A2_Zenith楼主2023/11/29 22:01
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<map>
#define int long long
#define db long double
#define pii pair<int,int>
#define up(i,l,r) for(int i=(l);i<=(r);i++)
#define down(i,l,r) for(int i=(l);i>=(r);--i)
#define p_b push_back
#define m_p make_pair
using namespace std;
//LONG LIVE BRUTE-FORCE ALGORITHM!!!
inline int lb(int x){return x&-x;}
int n;
int a[100007];
int b[100007];
int tmp1[100007];
int tmp2[100007];
int t[100007];
const int mod=1e8-3;
inline void upd(int x,int k){
    while(x<=n){
        t[x]+=k;
        x+=lb(x);
    }
}
inline int qry(int x){
    int s=0;
    while(x){
        s+=t[x];
        x-=lb(x);
    }
    return s;
}
struct node{
    int pra;
    int prb;
}pk[100007];
bool cmp1(node x,node y){
    return x.pra<y.pra;
}
bool cmp2(node x,node y){
    return x.prb<y.prb;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<=n;i++)tmp1[i]=a[i];
    sort(tmp1+1,tmp1+n+1);
    int l=unique(tmp1+1,tmp1+n+1)-tmp1-1;
//    cout<<l<<endl;
    for(int i=1;i<=n;i++){
        a[i]=lower_bound(tmp1+1,tmp1+l+1,a[i])-tmp1;
    }
    for(int i=1;i<=n;i++)tmp2[i]=b[i];
    sort(tmp2+1,tmp2+n+1);
    l=unique(tmp2+1,tmp2+n+1)-tmp2-1;
//    cout<<l<<endl;
    for(int i=1;i<=n;i++){
        b[i]=lower_bound(tmp2+1,tmp2+l+1,b[i])-tmp2;
    }
    for(int i=1;i<=n;i++){
        pk[i].pra=a[i];
        pk[i].prb=b[i];
    }
//    sort(pk+1,pk+n+1,cmp1);
//    for(int i=1;i<=n;i++)cout<<pk[i].pra<<" ";
//    cout<<endl;
//    for(int i=1;i<=n;i++)cout<<pk[i].prb<<" ";
    stable_sort(pk+1,pk+n+1,cmp2);
    int ans=0;
    for(int i=n;i>=1;i--){
        ans=(ans+qry(pk[i].pra-1))%mod;
        upd(pk[i].pra,1);
    }
    cout<<ans%mod<<endl;
    return 0;
}

2023/11/29 22:01
加载中...