社区讨论
关于题解的一个小疑惑
P2345[USACO04OPEN] MooFest G参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo7s4rp3
- 此快照首次捕获于
- 2023/10/27 06:52 2 年前
- 此快照最后确认于
- 2023/10/27 06:52 2 年前
CPP
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <algorithm>
using namespace std;
int n,i;
long long ans;
struct str{
int x,v;
}a[100005],tmp[100005];
bool cmp(str x,str y)
{
return x.v<y.v;
}
void cdqdfs(int l,int r)
{
if(l>=r)
return;
int mid=(l+r)/2,ll=l,i;
long long s1=0,s2=0;
cdqdfs(l,mid);
cdqdfs(mid+1,r);
for(i=l;i<=mid;i++)
s1+=a[i].x;
for(i=mid+1;i<=r;i++)
{
while(ll<=mid&&a[ll].x<a[i].x)//ll为划分的中点,其左边都小于a[i].x,右边都大于或等于a[i].x
{
s2+=a[ll].x;
s1-=a[ll].x;
ll++;
}
ans+=(1ll*a[i].x*(ll-l)-s2-1ll*a[i].x*(mid-ll+1)+s1)*a[i].v;
}
int l1=l,l2=mid+1,k=l-1;
while(l1<=mid||l2<=r)//归并排序
{
if((a[l1].x>a[l2].x||l1>mid)&&l2<=r)
{
tmp[++k]=a[l2];
l2++;
}
else
{
tmp[++k]=a[l1];
l1++;
}
}
for(i=l;i<=r;i++)
a[i]=tmp[i];
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d %d",&a[i].v,&a[i].x);
sort(a+1,a+1+n,cmp);
cdqdfs(1,n);
cout<<ans;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...