2017-03-17 6 views
0

誰もが、私ははっきりと編集コードで書かれていただきました取得することはできませんよhackerrank(包除原理アプローチ) https://www.hackerrank.com/challenges/candles-2
上の問題をカウントろうそくに使用bitmaskingを考え出すに私を助けてください。 i番目のキャンドルの色の色はすでにだった場合 あなたは)完全なコードの編集カウントが

int res = 0; 
for(int mask = 0; mask < (1 << K); mask ++){ 
    memset(ft, 0, sizeof ft); 
    int tmp = 0; 
    for(int i = 0; i < N; i++){ 
     if((mask >> (C[i] - 1)) & 1){ 
      dp[i] = 1 + query(H[i] - 1); // BIT Query function 
      madd(tmp, dp[i]); 
      update(H[i], dp[i]); // BIT update function 
     } 
    } 
    if(__builtin_popcount(mask) % 2 == K % 2){ 
     madd(res, tmp); 
    } else { 
     madd(res, mod - tmp); 
    } 
} 

答えて

0

は、ここで私はあなたが

1をposted-コードからそれから作ることができるものだif((mask >> (C[i] - 1)) & 1)チェックを開くことができます存在しないか(と仮定マスクは、コードにはmetionがないとして既に使用される色を格納するために使用される)

2)query(H[i] - 1) RET現在のろうそくが最初のものであり、それが除外されていれば、「カラフルな部分列」を得るので、すべての前回のろうそくから部分配列の数を形成することができる。

3)update(H[i], dp[i]);は、必要とされないろうそくをすべて取り除くために使用されます。

例 - 2 3 1 4 5 6 1 7 8 の順で次の色を持つ場合、2番目の「1」に達すると、配列の格納された色は「2 3 1 'が削除され、' 7 8 'が読み込まれます。 URコード申し訳

4)madd(tmp, dp[i]);十分ではないデータ。

5)__builtin_popcount(mask)は、マスク内の1の数をカウントします。