真的沒想到、、、果然反應太遲鈍,看到題目毫無思路,一點聯想都沒有。
按照網上部落格的說法:一眼棋盤染色二分->二分圖->最大匹配->bingo?果然我還是太弱了……
我們將棋盤黑白染色,相鄰兩點之間的轉移轉化為圖上的邊。根據最大匹配的定義,如果我們最開始將棋子放在乙個未匹配的點上,一定會到達乙個匹配點(不然若到達了另乙個未匹配點就說明還有可以擴張的匹配。)此後,因為已經是最大匹配所以不存在可以增廣的交替路。所以這樣先手一定會比後手多走一步,獲得勝利。所以問題轉化為:有哪些點不在最大匹配上?注意最大匹配的情況數是很多的。
所以我們列舉每乙個點是否可以不被納入最大匹配,若可以,說明是乙個先手必勝點。
#include usingnamespace
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 ...