2016-03-26 8 views
1

解決の背後にあるロジックをproblemに取得できません。誰かが私にそれの働きを説明することができれば、とても感謝しています。回転アレイ(Larray hackerrank)

ソリューション:

#include <bits/stdc++.h> 
using namespace std; 
const int N=1509; 
int n; 
int a[N]; 

void input(){ 
    scanf("%d",&n); 
    for (int i=1;i<=n;i++) 
     scanf("%d",&a[i]); 
} 

void sol(){ 
    int K=1; 
    for (int i=1;i<=n;i++) 
    for (int j=i+1;j<=n;j++) 
     K^=(a[i]>a[j]); 
    if (K) printf("YES\n"); 
    else printf("NO\n"); 
} 

int main() { 
    int test; 
    scanf("%d",&test); 
    while (test--){ 
     input(); 
     sol(); 
     } 
    return 0; 
} 

私は最終的には「K」の値が(それは順番を並べ替えに配置することができるかどうかをIE)の答えを決定され、各順列をXORした後、どのように取得することはできませんよ?

+0

あなたのための障害物は何ですか? –

+0

私は各順列をxoringした後、最終的に 'k'の値が答えを決定している(つまり、ソート順に並べることができるかどうか)ことができませんでしたか? –

+0

正確な質問を投稿に追加してください([編集])。誰もがすべてのコメントを読むわけではありません。 –

答えて

2

ブロックを回転させると、反転の回数を+/- 2または0(あなたが私を信用していない場合は紙上で処理します)に変更します。したがって、配列内の逆数が奇数の場合、指定された操作でソートさせることはできません。あなたは2つの要素以外のすべての要素(1つの反転)でほぼ並べ替えられた配列になり、与えられた操作でそれを修正することはできません。

コードが行うことは、逆転の回数が逆転するたびにそれ自身をxoringすることによって奇数であるかどうかをチェックすることです。反転をカウントしてinversions % 2 == 0をチェックすると同じ結果が得られます。