題意:有n
nn個球隊,如果一支球隊勝場為x
ix_i
xi,負場為y
iy_i
yi,那麼他們的獎金即為ci×
xi2+
di×y
i2
c_i\times x_i^2+d_i\times y_i^2
ci×xi
2+d
i×y
i2。現在知道了這些球隊現在的勝場和負場,以及一些不確定的比賽,問總獎金最少是多少。
那麼考慮乙個球隊多贏了一把獎金的變化。
先假設這個球隊輸了所有能輸的比賽,那麼現在他們的勝場是x
xx,負場是y
yy,現在他們贏回來了一局,那麼勝場就是x+1
x+1x+
1,負場是y−1
y-1y−
1。獎金的變化就是(x+
1)2×
ci+(
y−1)
2×di
−x2×
ci−y
2×di
=(2×
x+1)
×ci−
(2×y
−1)×
di
(x+1)^2\times c_i+(y-1)^2\times d_i-x^2\times c_i-y^2\times d_i=(2\times x+1)\times c_i-(2\times y-1)\times d_i
(x+1)2
×ci
+(y−
1)2×
di−
x2×c
i−y
2×di
=(2
×x+1
)×ci
−(2
×y−1
)×di
所以現在就可以這樣建出邊了: cod
e:
code:
code
:
#include
#define regi register int
int n,m;
int s,t;
int ans;
int mincost;
int dis[
101000];
int vis[
101000];
int maybe[
1000000];
//maybe表示這個隊最多能再獲勝幾把
int a[
1000000
],b[
1000000];
int c[
1000000
],d[
1000000];
int head[
1000000
],tot=1;
std::queue<
int>q;
struct edgee[
1000000];
void
add(
int x,
int y,
int flow,
int cost)
; head[x]
=tot;
e[++tot]=;
head[y]
=tot;
}bool
spfa()
}}}return dis[t]
!=0x3f3f3f3f;}
intdfs
(int x,
int min)
}return flow;
}void
dinic()
}}main()
for(regi i=
1;i<=n;
++i)
}dinic()
;printf
("%d\n"
,ans+mincost)
;return0;
}/***實現:
記錄每個球隊最多能贏的勝場,然後建邊。
*/
JSOI2009 球隊收益
因為要限制每個比賽,一勝一負,流量無法限制。所以我們可以假設先全敗,然後選擇某個人獲勝,然後用差值來改變。假設當前a勝,b負。然後獲勝一次的差值為 c a 1 a 1 d b 1 b 1 c a a d b b c 2 a 1 d 2 b 1 ac pragma gcc optimize ofast...
1449 2895 JSOI2009 球隊收益
題目鏈結 題目大意 n 支球隊,球隊的支出和勝負場次有關,具體來說,第i支球隊的賽季總支出是ci x2 di y 2,其中x,y 分別表示這只球隊本賽季的勝負場次。現在賽季進行到了一半,每只球隊分別取得了ai 場勝利和bi 場失利。而接下來還有 m 場比賽要進行。問聯盟球隊的最小總支出是多少。題解 ...
JSOI2009 bzoj1449 球隊收益
description input output 乙個整數表示聯盟裡所有球隊收益之和的最小值。首先假設全輸,然後給每場比賽分配乙個贏家,每個隊伍每多贏一場多獲得的收益作為費用。但是有乙個問題,如何保證每次走的是對應的邊?也就是,如何保證贏第一場的時候增加的收益是贏一場減贏零場,而不是贏兩場減贏一場?...