ナップザック暗号(状压DP)

タイトル説明

エイミーは、Eは、次のような問題を解決するためにB氏を助けてくださいB氏の問題を尋ねます。

最初にお互いを知らないn個の人々が、あります。
メートルのターンがあります。各ターンでは、それらの2はお互いに友達を作るだろう。
友人関係は、相互の推移です。
AはBの友人である場合、BもAの友人であります
AはBの友人がある場合たとえば、BがCの友人で、その後、AとCは友人です。
初めに、各ターンの後、これら四つの任意の二つは友人ではないことなどから、4人を選択するために、いくつかの方法を計算してください。

説明を入力します。

最初の行は、人々の数、及びターン数である2つの整数n及びm(N <= 100000、M <= 200000)を含有します。

次のm行では、i番目の行は、二つの整数xとyのx番目の人及びyを意味する(1 <= xで<= N、1 <= Y <= nは、≠をyとx)が、含まれてい番目の人は、i番目のターンで友達を作ります。

x番目の人とy番目の人が数ターンで友達を作るかもしれません。

出力説明:

出力M + 1本のラインは、各ラインは、四倍の数である整数を含んでいます。

初めに、各ターンの後に出力するので、M + 1行があります。
例1

エントリー

コピー
6 6 
1 2 
3 4 
4 
3 5 
3 6 
2 4

輸出

コピー
15 
9 
4 
0 
0 
0 
0
例2

エントリー

コピー
100000 0

輸出

コピー
4166416671249975000

説明

int型を使用しないでください。

レポートの問題解決:これはバックパックにタイトルを見て始めたが、その後、バックパック、あまりにも多くの容量、および配列を格納する方法はありませんされ、それがn未満であるので、あなたは、圧力のように考えることができます、36に等しい
溶液プロセスの後半に格納されたマップを開く必要があり、圧縮形状、それはバイナリ電圧を形成するためにセグメント化することができるように、そのような複雑さを低減することができるジャンプのタイプを指示する方法は明らかではありませんマップを照会し、その後する
注意することは、それぞれが裁判官に行って、所望の結果を得ることができない、唯一つの単語を2つのストレージアレイを設定する必要があります。


ACコード:
1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include <CStringの>
 4の#include <cstdioを>
 5の#include <cmath>
 6の#include <地図>
 7  使って 名前空間STD。
8 typedefの長い 長いLL。
9  
10  のconst  int型 MAXN = 1E6 + 1000年11  
12  のLL NUM1 [MAXN]。
13  LLのNUM2 [MAXN]。
14  LL和[MAXN]。
15  LLのSUM2 [MAXN]。
16  INT N。
17の LL秒;
18マップ<LL、int型 > 融点;
19  のint main()の
 20  {
 21      CIN >> N >> S。
22      のためには、int型、I = 1 ; I <= N; I ++ 23          CIN >> NUM1 [I]。
24      INTミッド= N / 2 25      のためには、int型 I = 1 iが++; iが=半ばを< 26          NUM2 [I- 1 ] = [I] NUM1と、
27      のためには、int型、I = 0 ; I <(1 << MID); I ++28      {
 29          のためにINT J = 0 ; J <ミッド; J ++ 30          {
 31              であれば(I&(1 << J))
 32                  和[I] + = NUM2 [J]。    
33          }
 34          MP [和[I] = I。
35      }    
 36      INT MID2 = N- ミッド。
37      のためにint型 iは=ミッド+ 1は、iがn = <; iは++ 38          NUM2 [I-半ば1 ] = NUM1 [I]。
39      のためのint型 i = 0 ; iが(< 1)<< MID2と、iは++ 40      {
 41          のためのint型 J = 0 ; J <MID2、J ++ 42          {
 43              であれば(I&(1 << J))
 44                  SUM2 [I ] + = NUM2 [J]。
45          }
 46          であれば(mp.count(S- SUM2 [I]))
 47          {
 48              INT TMP =融点[S- SUM2 [I]]。
49              のためのint型 J = 0 ; jの<半ば; J ++50              {
 51                  であれば(TMP&(1 << J))
 52                      COUT << 1 53                  他の
54                      coutの<< 0 ; 
55              }
 56              のためにINT J = 0 ; J <MID2、J ++ 57              {
 58                  であれば(I&(1 << J))
 59                      COUT << 1 60                  
61                      COUT << 0 62              }
 63              COUT << ENDL。
64          }
 65      }
 66 }

 



おすすめ

転載: www.cnblogs.com/Spring-Onion/p/11360771.html