bzoj1449 JSOI2009 球隊收益

2021-07-31 09:42:01 字數 1112 閱讀 7065

傳送門

感覺就是費用流呀。

可以發現這道題與之前的費用流題有所不同,因為乙個球隊不論輸還是贏都會獲得收益。

這裡就要用到乙個技巧,我們可以假裝比賽雙方都輸,然後修改贏的就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 分析 很妙的...