BZOJ_2115 [Wc2011] Xorの直鎖状の基[ON]図。

私は、題し

  【Wc2011] Xorの

第二に、分析

  質問もっと面白い、ここにも結論を学んだ:$ 1 $に$ N $任意のパスXORをし、ループの一部に排他的XORと図$ N $の任意の1 $ 1 $であってもよいですか、そして利用可能な組み合わせ。自分自身の数の排他的または$ 0 $に等しいので。

  この問題のために、それはすべてが模索し、その後、XOR値の$ N $パスに$ 1 $のいずれかとして、すべてのシンプルなリング構成のリニア・グループの値(DFS $を$することができ、すべてのシンプルなリングする必要がありますあなたはそれは問題ではないパス上のリングを持っていない場合、あなたは再び、このリングの場所に来ることができ、このリングは)異なるオフセットに二回行く、またはをクリックして、このパスの出発点に相当し、最大値を求めています。

三、ACコード

1つの#include <ビット/ STDC ++ H>
 2  
3  使用して 名前空間STDを、
4  の#defineっ長い長い
 5  の#define MIN(A、B)((A)>(B)?(B):( A))
 6  の#define MAX(A、B)((A)>(B)? (A):( B))
 7  のconst  int型 MAXN = 5E4 + 13 8  のconst  int型 MAXL = 60 9  
10  構造体端部
 11  {
 12      INT 、REVに、
13      LLコスト。
14      エッジ(){}
 15      エッジ(INTLLコスト、にint型REV){
 16           - > =までに、
17           - >コスト= コスト;
18           - > REV = REV。
19      }
 20  }。
21ベクター<縁> G [MAXN]。
22 LL和[MAXN]、ANS [MAXN << 3 ]、基地 [MAXL + 2 ]。
23  int型のCNT;
24  ブールフラグ[MAXN]。
25の 
26  ボイド DFS(int型の、int型REV)
 27  {
 28     フラグ= [S]で1。;   
 29      INT I = 0 ;私はGを<S] .size();私は++ ){
 30          エッジE = G [S] [I]は、
 31である         IF(!改訂= I){
 32              IF(!フラグ[e.to]で){
 33は、                  SUM [e.to] = SUM [S] ^ e.cost;
 34は                 DFS(e.to、e.rev);
 35              }
 36              {
 37                  // レコード排他的論理和リング
38である                  ANS [CNT ++] = SUM [e.to] ^ SUM [S] ^ e.cost;
 39              }
 40         }
 41      }
 42  }
 43  
44  空隙getbase()
 45  {
 46      のmemset(ベース0はsizeofベース))。
47      のためには、int型 = Iを0 ; iは<CNTを、iは++ ){
 48          のためにINT J = MAXLあり、j> = 0 ; j-- ){
 49              であれば((ANS [I] >> j)を&1 ){
 50                  もし基地[J]){
 51                     ANS [I] =のANS [I] ^ 基地[J]。
52                  }
 53                  {
 54                      塩基 [J] =のANS [I]。
55                      のためのint型 K = J - 1、K> = 0 ; k-- 56                          であれば((基地 [J] >> K)&1 57                              塩基 [J] ^ = 基地[K]。
58                      のためのint型 K = J + 1、K <= MAXL; ++ k個59                          であれば((基地 [K] << J)・160                              基地 [K] ^ = 基地[J]。
61                      ブレーク;
62                  }
 63              }
 64          }
 65      }
 66  }
 67  
68  のint main()の
 69  {
 70      freopenは(" INPUT.TXT "" R " 、STDIN)。
71      int型 N、M、から、であり;
72      のLL D。
73      エッジe。
74      のscanf(" %D%dの"、&​​N、&M)。
75      のためにint型 I = 0 ;私がm <; Iは++ ){
 76          のscanf(" %D%D%LLD "、&から、&&、のD)。
77          G【から.push_back](エッジ()).size([する] G、D、に)。
78          .push_back【に】G(エッジ(から [D、G、から .size(]) - 1 ))。
79      }
 80      のmemset(和、0はsizeof (合計))。
81      のmemset(フラグ、0はsizeof(フラグ))。
82      CNT = 0 83の      DFS(1 - 1 )。
84      getbase()。
85      LLアンス= 和[N]。
86      のためにint型 = MAXLをIを、I> = 0 ; i-- ){
 87          であれば(ANS <(ANS ^ 基地[I]))
 88              アンス^ = 基地[I];
89      }
 90      のprintf(" %LLDする\ n " 、ANS)。
91      リターン 0 ;
92 }

 

おすすめ

転載: www.cnblogs.com/dybala21/p/11366724.html