Code Forces Contest #11

這次的題目對我來說比較 thinkable 呢

一如以往, A 和 B 理論上都可以秒殺的, 不過 B 看漏了 input 可以 < 0 , WA 了一棍

 

C 是 given 一個 $n*m$的01 matrix, 要數有幾多個由1圍成的 square , 一個 square 有兩種:

A)

01110
01010
01110

B)

00100
01010
10001
01010
00100

 

以且那些 square 不能在 edge or corner touch 到其它不屬於果個 square 邊界的 1, 例如

00001
01110
01110
01110
00000


n,m <= 250

 

 

 

 

D 是 given 一個 undirected graph, 數有幾多個 simple cycle (無self-cycle, 無 repeated edge/node)

|V| <= 19

 

 

 


Solutions

 

C 最後雖然做唔切, 但諗到個 $O(N^3)$ 的做法

 

窮舉所有點做一個正方形的左上角, 再窮舉佢的邊長, 用 inclusive-exclusive 快速 check 佢 valid 唔 valid

check type B 的正方形比較麻煩, 不過估計可以將成個 matrix rotate 45度 黎做....

 

 

D

一開始諗的是

DP[BIT_PATTERN][X][Y]

BIT PATTERN = 條 path visit 過的 node

X = start node

Y = end node

DP[BIT_PATTERN][X][Y] = number of paths

 

但單係 state 己經係 $O(2^N*N^2), 計埋 transfer 應該會 TLE

 

之後想到, 這個方法會將一個 cycle 計好幾次, 例如 (1->5->7->2->1) 等價 (5->7->2->1->5) ...

 

解決方法就係 set 死 node label 最小的 node 為 start node!

所以 state 變為 DP[BIT_PATTERN][Y]

最後一次過加哂 valid 的 DP[BIT_PATTERN][Y] !

不過有個位忘了用 long long, 浪費左唔少時間..

總 time order: $O(2^N*N^2)

未分类 Comments(860) Wed, 28 Apr 2010 08:10:44 +0800