提出 #52970218


ソースコード 拡げる

// LUOGU_RID: 157503153
#include<iostream>
#include<algorithm>
#define ll long long

using std::sort;
const int N=4e5+5;
int n,q,i;
ll t[N],ans=0;
ll T[N];
int rank[N];
int lowbit(int x){
	return x&-x;
}
struct NODE{
	int val;
	int id;
}a[N]; 
bool operator<(const NODE&x,const NODE&y){
	if(x.val==y.val) return x.id<y.id;
	return x.val<y.val;
}
void update(int x,int k){
	for(;x<=n;x+=lowbit(x))t[x]+=k;
}
ll query(int l){
	ll ans=0;
	for(;l;l-=lowbit(l)){
		ans+=t[l];
	}
	return ans;
}
void update2(int x,int k){
	for(;x<=n;x+=lowbit(x))T[x]+=k;
}
ll query2(int l){
	ll ans=0;
	for(;l;l-=lowbit(l)){
		ans+=T[l];
	}
	return ans;
}
int b[N];
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	std::cin>>n;
	for(i=1;i<=n;++i){
		std::cin>>a[i].val;
		a[i].id=i;
		b[i]=a[i].val;
	}
	sort(a+1,a+n+1);
	for(i=1;i<=n;++i){
		rank[a[i].id]=i;
	}
	for(i=n;i>=1;--i){
		ll S=query(n)-query(rank[i]);
		ll s=query2(n)-query2(rank[i]);
		update(rank[i],b[i]);
		update2(rank[i],1);
		ans+=S-s*b[i];
	}
	std::cout<<ans;
	return 0;
}

提出情報

提出日時
問題 F - Double Sum
ユーザ tomxi_
言語 C++ 17 (gcc 12.2)
得点 500
コード長 1070 Byte
結果 AC
実行時間 82 ms
メモリ 16032 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 2
AC × 11
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3480 KiB
00_sample_01.txt AC 1 ms 3544 KiB
01_random_00.txt AC 6 ms 4456 KiB
01_random_01.txt AC 81 ms 15988 KiB
01_random_02.txt AC 55 ms 12164 KiB
01_random_03.txt AC 82 ms 16032 KiB
01_random_04.txt AC 34 ms 8816 KiB
01_random_05.txt AC 81 ms 15984 KiB
02_corner_00.txt AC 45 ms 16032 KiB
02_corner_01.txt AC 1 ms 3544 KiB
02_corner_02.txt AC 49 ms 16028 KiB