工作使艾奇快樂。
勤奮的工作為國家直接貢獻了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...