JSOI2009 球隊收益 Solution

2021-10-01 23:08:40 字數 1972 閱讀 3516

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