傳送門
感覺就是費用流呀。
可以發現這道題與之前的費用流題有所不同,因為乙個球隊不論輸還是贏都會獲得收益。
這裡就要用到乙個技巧,我們可以假裝比賽雙方都輸,然後修改贏的就ok辣。
然後就是每個人向終點連邊,這裡的費用隨著流量的變化而變化,所以我們要用到拆邊法。考慮乙個人從贏win[i]次、輸lose[i]次變為贏(win[i]+1)、輸(lose[i]-1)次,總費用的變化量為c[i](win[i]+1)^2+d[i](lose[i]-1)^2-c[i]win[i]^2-d[i]*lose[i]^2=c[i](2*win[i]+1)-d[i]*(2*lose[i]-1)。就這樣一條一條地加邊,同時修改win[i]和lose[i]。
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define n 6005
using
namespace
std;
queue
q;struct edgee[n*3];
int head[n],dis[n],v[n],from[n];
int win[n],lose[n],a[n],b[n],c[n],d[n];
int tot=1,n,m,s,t,ans;
void add(int x,int y,int f,int v);
head[x]=tot;
e[++tot]=(edge);
head[y]=tot;
}bool bfs()}}
return dis[t]!=inf;
}void del()
}int main()
for (int i=1;i<=n;i++)
ans+=c[i]*win[i]*win[i]+d[i]*lose[i]*lose[i];
for (int i=1;i<=m;i++)
while (bfs()) del();
printf("%d",ans);
}
JSOI2009 bzoj1449 球隊收益
description input output 乙個整數表示聯盟裡所有球隊收益之和的最小值。首先假設全輸,然後給每場比賽分配乙個贏家,每個隊伍每多贏一場多獲得的收益作為費用。但是有乙個問題,如何保證每次走的是對應的邊?也就是,如何保證贏第一場的時候增加的收益是贏一場減贏零場,而不是贏兩場減贏一場?...
BZOJ1449 JSOI2009 球隊收益
bzoj luogu 在乙個籃球聯賽裡,有 n 支球隊,球隊的支出是和他們的勝負場次有關係的,具體來說,第i支球隊的賽季總支出是 c i times x 2 d i times y 2,d i le c i 其中 x,y 分別表示這只球隊本賽季的勝負場次。現在賽季進行到了一半,每只球隊分別取得了 a...
bzoj1449 JSOI2009 球隊收益
time limit 5 sec memory limit 64 mb submit 1131 solved 640 submit status discuss 乙個整數表示聯盟裡所有球隊收益之和的最小值。3 31 0 2 1 1 1 10 1 0 1 3 3 1 22 3 3 143 分析 很妙的...