为啥跑的这么慢呢
查看原帖
为啥跑的这么慢呢
251855
JERRYY楼主2021/3/18 18:20

如题,题目P2345

朴素 O(n2)算法大概跑出来1s

我的疑似 O(nlogn)算法高达 400 ms

然而最快的都有 40ms 了 。。。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ull;
ull n,ans,sum[21000];
struct animal
{
	ull v,x;
}p[21000];
bool cmp1(animal u1,animal u2)
{
	if(u1.v!=u2.v) return u1.v<u2.v;
	return u1.x<u2.x; 
}
bool cmp2(animal u1,animal u2)
{
	return u1.x<u2.x;
}
void work(int l,int r)
{
	if(l==r) return;
	int mid=(l+r)>>1;
	work(l,mid);
	work(mid+1,r);
	
	memset(sum,0,sizeof(sum));
	
	ull h1=l-1,h2=mid;
	ull t=0;
	for(int i=l;i<=mid;i++)
	t+=p[i].x;

	while(h2<r)
	{
		h2++;
		while(p[h1+1].x<p[h2].x&&h1<mid) h1++,t=t-p[h1].x*2;
  
		ans=ans+p[h2].v*((h1*2-mid-l+1)*p[h2].x+t);
	}
	sort(p+l,p+r+1,cmp2);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>p[i].v>>p[i].x;
	sort(p+1,p+n+1,cmp1);
	work(1,n);
	cout<<ans;
}
2021/3/18 18:20
加载中...