BZOJ1449 JSOI2009 球隊收益

2022-04-28 20:33:16 字數 1244 閱讀 2832

bzoj

luogu

在乙個籃球聯賽裡,有\(n\)支球隊,球隊的支出是和他們的勝負場次有關係的,具體來說,第i支球隊的賽季總支出是\(c_i\times x^2+d_i \times y^2,d_i \le c_i\), 其中\(x,y\)分別表示這只球隊本賽季的勝負場次。現在賽季進行到了一半,每只球隊分別取得了\(a_i\)場勝利和\(b_i\)場失利。而接下來還有\(m\)場比賽要進行。問聯盟球隊的最小總支出是多少。

費用流建模。

先假設剩下的每場比賽雙方都輸了,這樣可以算出乙個基礎支出。

因為每場比賽要有乙個贏家,所以對於一場比賽,我們需要讓參賽雙方中的乙隻球隊的勝場++,負場--。

對於\(i\)號球隊,每有一場比賽由輸變為贏,設其當前的勝負場數分別為\(x,y\),則\(\delta\)支出=\(c_i(x+1)^2+d_i(y-1)^2-c_ix^2-d_iy^2=c_i(2x+1)+d_i(-2y+1)\)。

可以看出,每有一場比賽由輸變為贏,其\(\delta\)支出的不一樣的。

而且是。。。遞增的?

所以拆邊就行了。在跑費用流的時候一定會選擇費用更小的邊所以答案一定是對的。

#include#include#include#includeusing namespace std;

int gi()

const int n = 6005;

struct edgea[n<<2];

int n,m,s,t,a[n],b[n],c[n],d[n],du[n],head[n],cnt=1;

int dis[n],vis[n],pe[n],ans;queueq;

void link(int u,int v,int w,int cost);head[u]=cnt;

a[++cnt]=(edge);head[v]=cnt;

}bool spfa()

} vis[u]=0;

} if (dis[t]==dis[0]) return false;

ans+=dis[t];

for (int i=t;i!=s;i=a[pe[i]^1].to)

--a[pe[i]].w,++a[pe[i]^1].w;

return true;

}int main()

for (int i=1;i<=n;++i)

while (spfa()) ;

printf("%d\n",ans);return 0;

}

JSOI2009 bzoj1449 球隊收益

description input output 乙個整數表示聯盟裡所有球隊收益之和的最小值。首先假設全輸,然後給每場比賽分配乙個贏家,每個隊伍每多贏一場多獲得的收益作為費用。但是有乙個問題,如何保證每次走的是對應的邊?也就是,如何保證贏第一場的時候增加的收益是贏一場減贏零場,而不是贏兩場減贏一場?...

bzoj1449 JSOI2009 球隊收益

傳送門 感覺就是費用流呀。可以發現這道題與之前的費用流題有所不同,因為乙個球隊不論輸還是贏都會獲得收益。這裡就要用到乙個技巧,我們可以假裝比賽雙方都輸,然後修改贏的就ok辣。然後就是每個人向終點連邊,這裡的費用隨著流量的變化而變化,所以我們要用到拆邊法。考慮乙個人從贏win i 次 輸lose i ...

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 分析 很妙的...