ZJOI 2005 夢幻摺紙

2022-05-13 07:06:50 字數 1287 閱讀 6502

給乙個 \(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人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味 以及胃口 不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。...