給乙個 \(n*m\) 的網格圖,每個網格上有 \([1,n*m]\) 的數字,且每個都出現且恰好出現一次.
顯然進行若干次摺疊直到剩下乙個 \(1*1\) 的小網格時,它在縱向上有 \(n*m\) 層.
那麼能否安排一種摺疊方案,使得這 \(n*m\) 層從上往下的標號恰好為 \(1\) 到 \(n*m\).
顯然每個縱向和橫向的格線都會被折到.我們觀察剩下的的那個小方格,可以發現每層都有向左或右,上或下的連線,而且上下的連線和左右的連線是無關的.
然而還是沒有什麼卵用...
這時我們考慮什麼情況下會不存在合法的方案,先舉個例子:1 3 4 2
.
我們想象面前有個 \(1*4\) 的紙條,先把3
折到1
的下面,再把4
折到3
的下面,這時我們發現2
居然折不進去了.
這是因為 \(4,2\) 和 \(1,3\) 的連線是同向的,那麼這樣就不能交叉進去了.
那麼我們發現摺痕的方向是相鄰的格線兩兩相反的(折一折就知道了)
根據上面的結論,相同的方向的摺痕不能存在相交.這樣我們就會只有一條的情況了.
對於一般情況,我們發現當一條格線被決策後,它所在的所有格仔都會被強制決策.
由於行和列是互不影響的,那麼這個就很好擴充套件了.
想了超級久的..
#define gg
const int n=110;
int n,m;
int g[n][n];
struct seg
inline void print()
bool operator < (const seg &a)const
sort(ref.begin(),ref.end());
assert(ref.size()==seg[t].size()*2);
stackstk;
for(int i=0;i<(int)ref.size();i++)
}} return true;
}signed main() {
int t; read(t);
for(int cas=1;cas<=t;cas++) {
read(n); read(m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
read(g[i][j]);
seg[0].clear(); seg[1].clear();
for(int i=1;i用時: \(\infty\)
ZJOI2005 沼澤鱷魚 題解報告
潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位於巴西中部馬托格羅索州的南部地區。每當雨季來臨,這裡碧波蕩漾 生機盎然,引來不少遊客。為了讓遊玩更有情趣,人們在池塘的 建設了幾座石墩和石橋,每座石橋連線著兩座石墩,且每兩座石墩之間至多只有一座石橋。這個景點造好之後一直沒敢對外開放,原因是池塘裡有不少危...
省選專練ZJOI2005午餐
這是個好題 考察dp優化,dp,貪心,01揹包變種。好首先對吃飯時間從大到小排序,因為一隊人打飯時長總和一樣。dp i,j 表示前i個人,第一組用j的時間。放第乙個揹包 dp i j min max dp i 1 j a i w j a i v 放第二個揹包 dp i j min max dp i ...
ZJOI2005 午餐 貪心,動態規劃
上午的訓練結束了,thu acm小組集體去吃午餐,他們一行n人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味 以及胃口 不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。...