70分求条
查看原帖
70分求条
907368
andycode楼主2024/9/24 17:19
#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
const int N=1e6+6;
ll n,a[N],b[N];
ll c1[N],c2[N],sum;
ll ans;
map<ll,ll> id;
struct Node{
	ll sum,cnt;
};
ll lowbit(ll x){
    return x&(-x);
}
void Add(ll x,ll y){
    if(x>sum)
        return;
    c1[x]+=y,c2[x]++;
    Add(x+lowbit(x),y);
}
Node Sum(ll x){
    if(x==0)
        return {0,0};
    return {c1[x]+Sum(x-lowbit(x)).sum,c2[x]+Sum(x-lowbit(x)).cnt};
}
void write(ll x){
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}
ll read()
{
	ll 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<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int main(){
    n=read();
    for(int i=1;i<=n;i++)
        a[i]=b[i]=read();
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++)
        if(i==1 || b[i]!=b[i-1])
            id[b[i]]=++sum;
    for(int i=n;i;i--){
        a[i]=id[a[i]];
        Add(a[i],i);
        Node t=Sum(a[i]-1);
        ans+=(ll)t.cnt*i*(n+1)-(ll)i*t.sum;
    }
    write(ans);
    return 0;
}

最后三个点T

2024/9/24 17:19
加载中...