社区讨论

关于题解的一个小疑惑

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 条回复,欢迎继续交流。

正在加载回复...