疑似数据过水
查看原帖
疑似数据过水
685825
XCDRF楼主2025/1/18 11:43

题目要求 0火柴高度<2310\le火柴高度<2^{31},如果用树状数组,应该要离散化。但这个题不离散化竟然也能过?

代码:

#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

希望能加强数据。

2025/1/18 11:43
加载中...