树状数组写挂了求助
查看原帖
树状数组写挂了求助
271096
Semorius楼主2021/11/17 19:22
#include <bits/stdc++.h>
using namespace std;
const long long SIZE = 200005;
const long long mod = (1e8) - 3;
long long n;
long long a[SIZE], b[SIZE], aa[SIZE], bb[SIZE];
long long w[SIZE];
long long c[SIZE];
long long ans;

inline long long rd(){
	long long x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x<<1)+(x<<3)+(ch^48);
		ch = getchar();
	}
	return x*f;
}

long long lowbit(long long x){
	return x & -x;
}

void add(long long x){
	for(long long i = x; i <= n; i += lowbit(x)) c[i]++;
}

long long ask(long long x){
	long long cnt = 0;
	for(long long i = x; i; i -= lowbit(x)) cnt += c[i];
	return cnt;
}

int main() {
	n = rd();
	for(long long i = 1; i <= n; i++) a[i] = rd(), aa[i] = a[i];
	for(long long i = 1; i <= n; i++) b[i] = rd(), bb[i] = b[i];
	sort(aa+1, aa+n+1);
	sort(bb+1, bb+n+1);
	for(long long i = 1; i <= n; i++)
		a[i] = lower_bound(aa+1, aa+n+1, a[i]) - aa;
	for(long long i = 1; i <= n; i++)
		b[i] = lower_bound(bb+1, bb+n+1, b[i]) - bb;
	for(long long i = 1; i <= n; i++) w[a[i]] = i;
	for(long long i = 1; i <= n; i++) a[w[b[i]]] = i;
//	for(long long i = 1; i <= n; i++) printf("%d ", a[i]);
//	printf("\n");
	for(long long i = n; i >= 1; i--){
		ans = (ans + ask(a[i]-1)) % mod;
		add(a[i]);
	}
	printf("%lld", ans);
	return 0;
}


2021/11/17 19:22
加载中...