user: chen chen [thestor1]task: starry
lang: c++
compiling...
compile: ok
executing...
test 1: test ok [0.008 secs, 3508 kb]
test 2: test ok [0.008 secs, 3508 kb]
test 3: test ok [0.011 secs, 3508 kb]
test 4: test ok [0.008 secs, 3508 kb]
test 5: test ok [0.016 secs, 3508 kb]
all tests ok.
your program ('starry') produced all correct answers! this is your
submission #3 for this problem.congratulations!
這道題我是用的是最直接的方法。用dfs得到每個cluster,然後之前所有的cluster都逐一比較。比較的時候也是8種形狀逐一比較。當然,先比較star的個數是否一樣,輪廓(長方形)是否一樣。每個cluster還用乙個set儲存了裡面所有的點。如果usaco支援unordered_set的話,說不定會更快些。標準答案比較的時候看著像是位操作啥的,應該比我的直觀解法快特別多,也沒看懂。
/* id: thestor1
lang: c++
task: starry
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include // #include using namespace std;
const int maxw = 100;
class cluster
};bool isin(int r, int c, int h, int w)
inline int index(int r, int c)
void dfs(int r, int c, int h, int w, vector> &skymap, cluster &cluster)
if (cluster.lr < 0 || c < cluster.lr)
if (r > cluster.ul)
if (c > cluster.ur)
skymap[r][c] = cluster.label;
cluster.size++;
// cluster.ones.push_back(make_pair(r, c));
cluster.ones.insert(index(r, c));
int dx = , dy = ;
for (int d = 0; d < 8; ++d) }
}bool issame(const cluster &c1, cluster &c2, vector> &skymap)
if (c1.h == c2.h && c1.w == c2.w)
}if (!flag)
}if (flag)
// up->down, right->left
flag = true;
for (int i1 = c1.ll, i2 = c2.ll; i1 <= c1.ul && i2 <= c2.ul; ++i1, ++i2)
}if (!flag)
}if (flag)
// down->up, left->right
flag = true;
for (int i1 = c1.ll, i2 = c2.ul; i1 <= c1.ul && i2 >= c2.ll; ++i1, --i2)
}if (!flag)
}if (flag)
// down->up, right->left
flag = true;
for (int i1 = c1.ll, i2 = c2.ul; i1 <= c1.ul && i2 >= c2.ll; ++i1, --i2)
}if (!flag)
}if (flag)
}if (c1.h == c2.w && c1.w == c2.h)
}if (!flag)
}if (flag)
// right->left, down->up
flag = true;
for (int i1 = c1.ll, j2 = c2.ur; i1 <= c1.ul && j2 >= c2.lr; ++i1, --j2)
}if (!flag)
}if (flag)
// left->right, up->down
flag = true;
for (int i1 = c1.ll, j2 = c2.lr; i1 <= c1.ul && j2 <= c2.ur; ++i1, ++j2)
}if (!flag)
}if (flag)
// right->left, up->down
flag = true;
for (int i1 = c1.ll, j2 = c2.ur; i1 <= c1.ul && j2 >= c2.lr; ++i1, --j2)
}if (!flag)
}if (flag)
}return false;
}void repaint(vector> &skymap, char label, cluster &cluster)
} }}int main()
} }char label = 'a';
for (int r = 0; r < h; ++r)
}if (unique)
}} }
for (int r = 0; r < h; ++r)
{ for (int c = 0; c < w; ++c)
{ fout<
USACO Hamming Codes 解題報告
資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...
USACO Closed Fences 解題報告
幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...
Wiggle Subsequence解題報告
這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...