先不考虑第二个条件
要求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
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\]<<" ";
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章