10分求条
查看原帖
10分求条
1037200
lty2023楼主2024/9/26 19:41

分治法,1AC,2WA,7RE

#include<bits/stdc++.h>
using namespace std;
struct pp{
	int num;
	int a;
};
pp c[100000010],a[100000010];
long long n;
void print(__int128 num){
	if(num > 9){
		print(num / 10);
	}
	putchar(num%10+'0');
}
__int128 sum=0;
long long gb_b(long long l1,long long r1,long long l2,long long r2){
	long long i=0;
	long long j=0;
	long long sum=0;
	long long a_size=r1-l1+1;
	long long b_size=r2-l2+1;
	while(i<a_size&&j<b_size){
		if(a[l1+i].a<=a[l2+j].a){
			c[sum++].a=a[l1+i++].a;
			c[sum].num=a[l1+i].num;
		}
		else{
			c[sum++].a=a[l2+j++].a;
			c[sum].num=a[l2+j].num;
			for(int aaa=i;aaa<a_size;aaa++){
				sum=sum+(a[l1+aaa].num+1)*(n-a[l1+aaa].num);
			}
		}
	}
	if(i<a_size){
		for(;i<a_size;){
			c[sum++].a=a[l1+i++].a;
			c[sum].num=a[l1+i].num;
		}
	}
	else{
		for(;j<b_size;){
			c[sum++].a=a[l2+j++].a;
			c[sum].num=a[l1+i].num;
		}
	}
	return a_size+b_size;
}
void gb(long long l,long long r){
	if(r-l==1){
		gb_b(l,l,r,r);
		for(long long i=0;i<2;i++){
			a[l+i].a=c[i].a;
		}
		return;
	}
	if(l==r){
		return;
	}
	long long mid=(l+r)/2;
	gb(l,mid);
	gb(mid+1,r);
	long long len=gb_b(l,mid,mid+1,r);
	for(long long i=0;i<len;i++){
		a[l+i].a=c[i].a;
	}
}
int main(){
	cin>>n;
	for(long long i=0;i<n;i++){
		cin>>a[i].a;
		a[i].num=i;
	}
	gb(0,n-1);
	print(sum);
}
2024/9/26 19:41
加载中...