背景
この問題は、実際にある\(M \ n回パズル\)、\ (POJ2893 \)が弱いバージョン、である李Yudong、北京のデータ構造とアルゴリズムの試験、\(CH0503 \) 。
問題の意味
所与\(N- \ n回が\)(\ (\ N-)奇数の整数である\(3 \ N-leqslant \ leqslant 500 \)ボード、上記)\(N \倍のn-1 \) 番号及びスペース。2所定数の前後の状況は、各々がそれだけの周りの空間の交換及び(もしあれば)隣接することができ、第2の状況のための第1の状況を移動させる方法があったかどうかを尋ねました。
ソリューション
ラインのボード上の線によって撮影された行の数が(スペースを取らない)、配列を得ることができます。
数学的操作を考えます。スペースの数について交換や数字の列に何の効果を逆転しないように。そしてスペースを垂直配列が交換される交換される(N-1 \)\位置番号。ためにも、\(N- \)奇数の整数であるので、\(N-1 \)は偶数の整数でなければならない、切り替え前後逆の変化が偶数でなければなりません。長いプロセスの具体的な証拠はなく、ここに展開します。この状況に対応する二つの配列への操作からのパリティとして逆同じ数は、そうでなければ、形質転換されてはならない場合にのみ場合、2つの状況が他のことができることを意味します。
次に、2つのマージソートの状況は、対数逆転しようとしています。時間の複雑さはある\(O(^ N-2)\) 。(ボトルネックが読み取り)アレイツリーの時間複雑逆要求\を(Oは((N-M +)\) \(ログ\) \(N-)\)(\ (M \)のサイズ範囲の値です)この問題に\(M = 249 \ 001) 、それはまた、本問題缶。あなたが書いたもの書くために好きなものを聖歌\(QAQ \)
\(トリック\)
\(1 \)数学的な意味を考えて、シーケンス動作に変換されたグリッドマップを操作するための手掛かりがありません。
\(2 \)空間とデジタル交換の周りには、上下、逆の順序の数に影響を及ぼさないと空間スイッチングシーケンス番号が交換される\(N-1 \)の位置番号、前と逆の数の切り替え後変更は偶数でなければなりません。(重要な結論、心に留めておく!!!)
ディテール
\(1 \)されている問題の範囲をソートする(1 \ SIM N \回\ N-1 \) の代わりに\(1 \ N-SIM \) 。(グッド吸盤のミスああ)
\(2 \)空のノートで読み出したデータのセット。(グッド吸盤のミスああ)
コード
$見る$ $コード$
//省略头文件 using namespace std; inline int read() { int ret=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { ret=(ret<<1)+(ret<<3)+ch-'0'; ch=getchar(); } return ret*f; } int n,tmp,k,rr,a[249005],b[249005],c[249005],ans1,ans2; void msort1(int l,int r,int mid) { if(l==r) return; msort1(l,mid,(l+mid)>>1); msort1(mid+1,r,(mid+1+r)>>1); int i=l,j=mid+1; for(register int k=l;k<=r;k++) { if(j>r||(i<=mid&&a[i] >1); msort2(mid+1,r,(mid+1+r)>>1); int i=l,j=mid+1; for(register int k=l;k<=r;k++) { if(j>r||(i<=mid&&b[i] >1); msort2(1,rr,(1+rr)>>1); if((ans1+ans2)&1) puts("NIE"); else puts("TAK"); } return 0; }