【Codeforces Round #519 by Botan Investments E】Train Hard, Win Easy
阿新 • • 發佈:2018-11-07
【連結】 我是連結,點我呀:)
【題意】
【題解】
設每個人做第一題、第二題的分數分別為x,y
我們先假設沒有仇視關係。
即每兩個人都能進行一次訓練。
那麼
對於第i個人。
考慮第j個人對它的貢獻
如果xi+yj<yi+xj
即xi-yi<xj-yj
也就是說,如果我們以x-y作為關鍵字升序排序的話。
那麼在第i個人右邊的所有人。他的xj-yj的值都大於xi-yi
那麼這n-i個人對第i個人的貢獻就都是xi+yj
可以用一個字首和,輕鬆搞定區間的x,y和。
xi+yj>yi+xj的話。
情況類似。
最後對於有仇敵關係的(i,j)的話。
第i個人和第j個人的貢獻都減去min(xi+yj,yi+xj)即可。
【程式碼】
#include <bits/stdc++.h> #define ll long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) using namespace std; const int N = 3e5; struct abc{ int x,y,id; bool operator < (const abc &b) { return (x-y)<(b.x-b.y); } }; int n,m; ll ans[N+10]; ll prex[N+10],prey[N+10]; abc a[N+10],b[N+10]; int main(){ #ifdef ccy freopen("rush.txt","r",stdin); #endif scanf("%d%d",&n,&m); rep1(i,1,n) { scanf("%d%d",&a[i].x,&a[i].y); a[i].id = i; } rep1(i,1,n) b[i] = a[i]; sort(a+1,a+1+n); rep1(i,1,n){ prex[i]+=prex[i-1]; prey[i]+=prey[i-1]; prex[i]+=a[i].x; prey[i]+=a[i].y; } //xi+yj<yi+xj //xi-yi<=xj-yj //xi+yj>yi+xj //xi-yi>xj-yj rep1(i,1,n){ ans[a[i].id] += 1LL*(i-1)*a[i].y+prex[i-1]-prex[0]; ans[a[i].id] += 1LL*(n-i)*a[i].x+prey[n]-prey[i]; } rep1(i,1,m){ int x,y; scanf("%d%d",&x,&y); ans[x]-=min(b[x].x+b[y].y,b[x].y+b[y].x); ans[y]-=min(b[x].x+b[y].y,b[x].y+b[y].x); } rep1(i,1,n){ printf("%lld ",ans[i]); } return 0; }