十字鍊錶 Working routine

2021-09-27 13:24:29 字數 1802 閱讀 1629

工作使艾奇快樂。

勤奮的工作為國家直接貢獻了gdp,艾奇認為只要對國家有利,即使犧牲自己生命也心甘情願,絕不會因為自己可能受到禍害而躲開。

當艾奇無聊的時候,她就會去工作,然而並不是每次工作都是輕鬆而愉悅的。

當天艾奇又一次來到了學校,等待著她的是乙個有n 行m 列的巨大的矩陣和q個任務。對於每個任務,艾奇被要求交換這個矩陣中的兩個子矩陣。

每個任務,艾奇會獲得六個正整數x1,y1,x2,y2,h,w。x1,y1 代表了第乙個矩陣 左上角的行列位置(即在第x1 行第y1 列);x2,y2 代表了第二個矩陣左上角的行列位置,h,w 代表了這兩個矩陣的高和寬(即行數和列數)。

資料保證每兩個需要交換的矩陣互不相交或相鄰。也就是說,沒有任何乙個元素同時屬於這兩個矩陣,也不存在某兩個元素分別屬於兩個矩陣且相鄰(共邊)。

輸入第一行三個整數n,m,q,表示矩陣的行數,列數,交換次數

接下來n行,每行m個數,表示原始矩陣

接下來q行,每行6個正整數x1,y1,x2,y2,h,w,表示要交換的兩個矩陣的左上角座標及所求矩陣的行數和列數。

輸出n行m個數,表示完成q次交換後的矩陣

一道非常神奇的題,這道題的解題關鍵就在於如何解決又換矩陣這乙個問題。

一些廢話:觀察資料範圍,我們發現可以用o((

n+m)

q)

o((n+m)q)

o((n+m

)q)的複雜度解決問題。

考慮鏈的做法:怎麼做矩陣的交換最方便呢,由於矩陣不想交,我們可以維護乙個鍊錶,即對[l1

,r1]

[l_1,r_1]

[l1​,r

1​]和[l2

,r2]

[l_2,r_2]

[l2​,r

2​]進行交換的話,需要將r

1r_1

r1​和r

2r_2

r2​的後繼交換。

那麼維護到矩陣上同理,我們可以維護乙個十字鍊錶,對於每乙個節點記錄右邊的點和下面的節點,這樣我們就可以可以做到快速交換了。

那麼如何交換呢,這裡我們需要在o(n

+m

)o(n+m)

o(n+m)

的時間內完成交換。

最後是輸出,這個就很簡單了,直接遍歷鍊錶即可。

#include

using

namespace std;

const

int n =

1200

;int n, m, k;

struct list a[n * n]

;int

read

(void

)inline

intc

(int x,

int y)

void

change

(void

)for

(int i=

1;i<=h;

++i)

p1 = t1, p2 = t2;

for(

int i=

1;i<=h;

++i)

for(

int i=

1;i<=w;

++i)

return;}

void

output

(void

)puts(""

);}return;}

intmain

(void

)while

(k --

)change()

;output()

;return0;

}

十字鍊錶(Java)

對於有向圖來說,鄰接表是有缺陷的。關心了出度問題,想要了解入度情況就必須要遍歷整個圖才能知道。反之也一樣。那麼,這一節就介紹有向圖的一種儲存方法,它能將鄰接表和逆鄰接表結合起來 十字鍊錶。定義頂點表結點結構 vertex firstin firstout 其中,firstin表示入邊表頭指標,指向該...

十字鍊錶(Orthogonal List)

十字鍊錶的特點 1 可以看成有向圖將鄰接表和逆鄰接表結合,每個結點有兩個指標域,分別指向入度邊鍊錶和出度邊鍊錶 2 時間複雜度與鄰接表相同 3 容易計算頂點的度 十字鍊錶的屬性 public static final int max vexnum num 20 最大頂點數 public static...

鄰接表 十字鍊錶

每一行都可以看成乙個單鏈表,第一行中,v0 1 3可以得到,v0的出度為v1和v3。鄰接表完整 include using namespace std const int max v 15 邊節點 typedef struct edge node enode,penode 表節點 typedef s...