前缀和+排序——cf1043E
阅读原文时间:2023年07月11日阅读:3

先不考虑第二个条件

要求i和所有其他人的分数和最小,选择x还是y,可以推出一个公式,即差xi-yi小的j都选y,反之都选x

那么按照xi-yi排序即可

然后再考虑第二个条件,做减法就行

/*
xi+yj
using namespace std;
#define ll long long
#define N 300005
struct Node {
ll x,y,id;
}p[N],q[N];
int n,m;
ll ans[N],sumx[N],sumy[N];
int cmp(Node a,Node b){return a.x-a.y>n>>m;
for(int i=;i<=n;i++)
scanf("%lld%lld",&p[i].x,&p[i].y),p[i].id=i;
for(int i=;i<=n;i++)q[i]=p[i];

sort(p+,p++n,cmp);  
for(int i=;i<=n;i++){  
    sumx\[i\]=sumx\[i-\]+p\[i\].x;  
    sumy\[i\]=sumy\[i-\]+p\[i\].y;  
}  
for(int i=;i<=n;i++){  
    ans\[p\[i\].id\]+=(i-)\*p\[i\].y;  
    ans\[p\[i\].id\]+=sumx\[i-\];  
    ans\[p\[i\].id\]+=(n-i)\*p\[i\].x;  
    ans\[p\[i\].id\]+=sumy\[n\]-sumy\[i\];  
}

while(m--){  
    int u,v;  
    scanf("%d%d",&u,&v);  
    Node a=q\[u\],b=q\[v\];  
    ll sum=min(a.x+b.y,a.y+b.x);  
    ans\[u\]-=sum;  
    ans\[v\]-=sum;  
}  
for(int i=;i<=n;i++)  
    cout<<ans\[i\]<<" ";  

}