题目要求 0≤火柴高度<231,如果用树状数组,应该要离散化。但这个题不离散化竟然也能过?
代码:
#include<iostream>
#include<algorithm>
#define lowbit(i) (i&(-i))
using namespace std;
const int N=1e5+5,mod=1e8-3;
int n,ans;
int a[N],b[N],A[N],B[N],l[N];
struct BIT{
int c[N];
void add(int x,int y){
for(;x<N;x+=lowbit(x)) c[x]=(0ll+c[x]+y)%mod;
}
int ask(int x){
int ans=0;
for(;x;x-=lowbit(x)) ans=(0ll+ans+c[x])%mod;
return ans;
}
}TR;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],A[i]=a[i];
for(int i=1;i<=n;i++) cin>>b[i],B[i]=b[i];
// sort(A+1,A+n+1);
// sort(B+1,B+n+1);
// int cnt1=unique(A+1,A+n+1)-A-1;
// int cnt2=unique(B+1,B+n+1)-B-1;
// for(int i=1;i<=n;i++){
// a[i]=lower_bound(A+1,A+cnt1+1,a[i])-A;
// b[i]=lower_bound(B+1,B+cnt2+1,b[i])-B;
// }
for(int i=1;i<=n;i++) l[a[i]]=i;
for(int i=1;i<=n;i++) b[i]=l[b[i]];
for(int i=n;i;i--){
ans=(0ll+ans+TR.ask(b[i]-1))%mod;
TR.add(b[i],1);
}
cout<<ans;
return 0;
}
中间那段注释是离散化。
加离散化AC记录:https://www.luogu.com.cn/record/198919250
不加离散化AC记录:https://www.luogu.com.cn/record/198919332
希望能加强数据。