cdq分治 1分求助
查看原帖
cdq分治 1分求助
555950
wdgm4楼主2023/3/24 19:32

评测记录

#include<bits/stdc++.h>
#define XD 114514
#define MAXN 50010
using namespace std;
int n;
struct QWQ{
	int v,x;
} a[MAXN];
bool cmp1(QWQ x,QWQ y){
	if(x.v!=y.v) return x.v<y.v;
	return x.x<y.x;
}
int len;
struct QAQ{
	int v,x,num;
} b[MAXN];
bool cmp2(QAQ x,QAQ y){
	return x.x<y.x;
}
unsigned long long ans=0;
void cdq(int l,int r){
	if(l==r) return;
	int mid=l+r>>1;
	cdq(l,mid);cdq(mid+1,r);
	sort(b+l,b+mid+1,cmp2);
	sort(b+mid+1,b+r+1,cmp2);
	int j=l;
	unsigned long long nem=0,nem2=0;
	for(int i=l;i<=mid;i++) nem2+=b[i].x;
	for(int i=mid+1;i<=r;i++){
		while(b[j].x<b[i].x and j<=mid){
			nem+=b[j].x;
			j++;
		}
		ans+=1ll*b[i].v*(b[i].x*(j-l)-nem+nem2-nem-b[i].x*(mid-j+1))*b[i].num;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].v>>a[i].x;
	sort(a+1,a+1+n,cmp1);
	int nem=0;
	for(int i=1;i<=n;i++){
		nem++;
		if(a[i].v!=a[i+1].v or a[i].x!=a[i+1].x){
			len++;
			b[len].v=a[i].v;
			b[len].x=a[i].x;
			b[len].num=nem;
			nem=0;
		}
	}
	cdq(1,len);
//	for(int i=1;i<=len;i++){
//		cout<<b[i].v<<" "<<b[i].x<<" "<<b[i].ans<<'\n';
//	}
	cout<<ans;
	return 0;
}

好像并不是爆 long long 的问题。求调QWQ。

2023/3/24 19:32
加载中...