題解 JSOI2009遊戲

2022-02-27 13:42:45 字數 1345 閱讀 7220

真的沒想到、、、果然反應太遲鈍,看到題目毫無思路,一點聯想都沒有。

按照網上部落格的說法:一眼棋盤染色二分->二分圖->最大匹配->bingo?果然我還是太弱了……

我們將棋盤黑白染色,相鄰兩點之間的轉移轉化為圖上的邊。根據最大匹配的定義,如果我們最開始將棋子放在乙個未匹配的點上,一定會到達乙個匹配點(不然若到達了另乙個未匹配點就說明還有可以擴張的匹配。)此後,因為已經是最大匹配所以不存在可以增廣的交替路。所以這樣先手一定會比後手多走一步,獲得勝利。所以問題轉化為:有哪些點不在最大匹配上?注意最大匹配的情況數是很多的。

所以我們列舉每乙個點是否可以不被納入最大匹配,若可以,說明是乙個先手必勝點。

#include using

namespace

std;

#define maxn 205

int n, m, a[maxn][maxn], link[maxn * 100

];int map[maxn * 100][5], ans[maxn * 100][2

];int

cnt, tot, id[maxn][maxn];

int px[4] = , py[4] = ;

bool vis[maxn * 100

];char

s[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}bool dfs(int

u) }

return0;

}void add(int u, int v)

intmain()

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

for(int j = 1; j <= m; j ++)

if(!a[i][j] && (i + j) % 2

)

for(int k = 0; k <= 3; k ++)

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

for(int j = 1; j <= m; j ++)

if(!a[i][j] && (i + j) % 2

)

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

for(int j = 1; j <= m; j ++)

if(!a[i][j])

}if(!tot) printf("

lose");

else

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...

JSOI2009 球隊收益 Solution

題意 有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 現在知道了這些球隊現在的勝場和負場,以及一些不確定的比賽,問總獎金...

JSOI2009 計數問題

把題面改下風格 有 n m 個點,每個點 i 有權值 xi,yi,zi,要求回答 q 次詢問,每次給定 l1,r1,l2,r2,l3,查詢有多少點滿足 l1 xi r1 l2 yi r2 l3 zi 說是三維 log3 的查詢,但直接開 z 個二維樹狀陣列,log 方也行。includeusing ...