バイナリ検索+状態+ハッシュテーブルの圧縮| [Usaco2012開く]バランス牛のサブセット| BZOJ 2679 | Luogu SP11469

質問は、表面:SP11469サブセット-バランス牛のサブセットを

ソリューション:

集合Aに属する、またはBの集合に属するいずれかの任意の数のために、選択された又はされていません。上記3つのケースに3つの係数1、-1、0に対応して設けられ、その後、対象変換

二組と0を見つけるには、答えのための非繰り返しのこれら二つのセットをマージします。バイナリ検索を考えてみましょう。前半と後半、ハッシュテーブルと圧縮された状態の記録を押収

そして、ディエンファシス、その後、統計への答え。

時間計算量はO(6 ^(N / 2))です。

コード:

1つの#include <cstdioを>
 2  使用して 名前空間STDを、
3  のconst  int型 MAXN = 25、MOD = 230203、MAX_NUM = 6E4。
4  整数 N、M [MAXN]、NUM = 0、ANS = 0、NX [MAX_NUM]、HD [MOD + 50 ]。
5  INT のTmp [MAX_NUM]、合計[MAX_NUM]、HF、PS。
6  BOOL VIS [ 1050 ] [ 1050 ]。
7インラインボイド挿入(INT TMP、INT 合計){
 8      PS =(和%MOD + MOD)%MOD。
9      int型 ; I I = I = HD [PS] NX [i])と
 10          であれば(TMP [I] == TMP &&合計[I] ==和)のリターン ; //
 11      NX [++ NUM] = HD [PS]。
12      のTmp [NUM] = TMP。
13      合計[NUM] = 合計。
14      HD [PS] = NUM。
15      リターン;
16  }
 17インラインINT(検索INT TMP、INT 合計){
 18      、PS =(和%MOD + MOD)%MODと、
19      INT ANS = 0 20     INT I = HD [PS]; I; I = NX [i])と
 21          であれば(SUM [I] ==和&& VIS [Tmpの[I] [TMP] == 0 ){
 22              VIS [Tmpの[ I] [TMP] = 1 23の              ANS ++ ;
24          }
 25の     リターンANS。
26  }
 27インラインボイド DFS1(INT TP、INT和、INT TMP){
 28      であれば(TP> HF){
 29          インサート(TMP、合計)。
30          リターン;
31      }
 32     DFS1(TP + 1、和+ M [TP]、TMP << 1 | 1 )。
33      DFS1(TP + 1、和M [TP]、TMP << 1 | 1 )。
34      DFS1(TP + 1、和、TMP << 1 )。
35      リターン;
36  }
 37インラインボイド DFS2(INT TP、INT和、INT TMP){
 38      であれば(TP> N){
 39の          ANSは+ =(TMP、 -検索和)。
40          リターン;
41      }
42      DFS2(TP + 1、和+ M [TP]、TMP << 1 | 1 )。
43      DFS2(TP + 1、和M [TP]、TMP << 1 | 1 )。
44      DFS2(TP + 1、和、TMP << 1 )。
45      リターン;
46  }
 47  INT メイン(){
 48      のscanf(" %dの"、&N)。
49      HF = N >> 1 50      のためにint型 I = 1のscanf(; iが= Nを<I ++)は、「%dの"& M [I]);
 51      DFS1(100 );
 52      DFS2(HF + 100 );
 53      のprintf(" %d個の\ n "、ans- 1 );
 54      リターン 0 ;
 55 }
コードの表示

 


で:AlenaNuna

 

おすすめ

転載: www.cnblogs.com/AlenaNuna/p/11590387.html
おすすめ