題意
艹,推逆序對推錯了,艹
咳咳,依舊是兩種做法。
考慮把整個圖化成一條數列。(第二行拼到第一行後面,以此類推)
考慮整個圖的逆序對數(0
00也考慮上)。
左右交換會使逆序對數+/−
1+/-1
+/−1
,那麼上下交換呢?
由於0
00比所有數字都要小,所以肯定會+−n
+-n+−
n 那麼x
xx在數列和中間的n−1
n-1n−
1個數字會產生多少個逆序對數呢,假設少了q
qq個逆序對,多了p
pp個逆序對?
那麼q +p
q+pq+
p為偶數,p−q
p-qp−
q必定為偶數,又因為n
nn為奇數,所以上下交換也是乙個奇數。
那豈不是意味著每次交換逆序對數就會改變,那拿什麼判斷呢?
但是不難發現0
00的移動也是個奇數,兩個一加就是偶數,所以只需要把整個圖的逆序對數加上0
00的位置即可。
但是至於為什麼奇偶性質相同一定能到達,我也不知道,求證明。
#include
#include
#define n 510000
using
namespace std;
int bst[n]
;int a[n]
,b[n]
,nn;
inline
intlowbit
(int x)
void
ins(
int x)
}int
findans
(int x)
return ans;
}int n;
intmain()
t+=n;}
for(
int i=
1;i<=nn;i++
)memset
(bst,0,
sizeof
(bst));
t=0;
for(
int i=
1;i<=n;i++)
t+=n;}
for(
int i=
1;i<=nn;i++)if
((an1&1)
==(an2&1)
)printf
("tak\n");
else
printf
("nie\n");
}return0;
}
參考
判斷忽略0
00之後的逆序對數是否相同,相同則可以到達,反之不能。
推法和上面差不多,我就不說了。
奇數碼問題
你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 528 13 46 7在遊戲過程中,可以把空格與其上 下 左 右四個方向之一的數字交換 如果存在 例如在上例中,空格可與左 上 下面的數字交換,分別變成 528 52 5...
奇數碼問題
題目描述 你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 5 2 8 1 3 4 6 7 在遊戲過程中,可以把空格與其上 下 左 右四個方向之一的數字交換 如果存在 例如在上例中,空格可與左 上 下面的數字交換,分別變...
108 奇數碼問題
類似我們小時候玩過的數字華容道,就是有乙個缺的然後可以移動變成不同的樣子,本題要你解決的是從狀態一能否通過移動變到狀態二。一開始拿到題一看這不就八數碼公升級版嗎,然後改了下八數碼 t了,其實結論做法很簡單,但是如果沒做過類似的題,可能想不到這裡去,這道題需要用奇偶性。奇偶性很神奇,對於一類問題,如果...