CF1676H2的题解

(一)

题意转化为求 \(i<j\) 且 $a_j\le a_i $ 的有序对 \((i,j)\) 数。

二维偏序,容易想到用树状数组或归并排序做。

(二)

AC 代码(树状数组)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t,tree[200010],a[200010];
int lowbit(int x){
	return x&-x;
}
void add(int x){
	for(;x<=n;x+=lowbit(x))tree[x]++;
}
int query(int x){
	int ans=0;
	for(;x;x-=lowbit(x))ans+=tree[x];
	return ans;
}
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(int i=1;i<=n;i++)tree[i]=0,scanf("%lld",&a[i]);
		int ans=0;
		for(int i=n;i>=1;i--){
			ans+=query(a[i]);
			add(a[i]);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
posted @ 2024-03-27 12:24  Jerry_heng  阅读(19)  评论(0编辑  收藏  举报