CF1168C到達可能性[構造、DP]

トピックリンク:羅区

説明タイトル:$私は<J $をと$ a_iを&a_j>場合は$、N- $ $ $ a_iを数を与えられた0 $、そして$ $ $ I $ Jはそこに一方の側に接続され、$ Q $回尋ね尋ね$ L $から、それは$ rの$を達するために始めることができます。

データ範囲:$ N、Qの\の当量3×10 ^ 5 $

素晴らしいと思考の問題。(以下のバイナリです)

二つの配列を維持し、$のG_ {I、J} $は$ I $添字添字は最大数と第$ J $、1ビットの指標である未満を表します。$のF_ {I、J} $は$ I $添字添字は最大数よりも少ないを表し、最初のビットは1 $ J $ $ I $であり、添え字に到達することができます。

$ G_ $はa_iを示す前処理を挙げることができる$ $ K言うまでもなく{I、J} $前処理は、$ F_ {I、J} $ $ $ G_から2番目のビットによって$ $ K {I、K} $ G_ {I、K}と$到達し、F $ $ I $のFナンバーを重視直接導入します。

、列挙の$ I $を尋ねられたとき、$はR&LT $ $ F_から表し{rは、i}は$到着し、そしてときに最初のビット$ I $ $ $ A_L 1及び$ F_ {R、I} \でありますGEQのL $の$ L $リーチの$ F_ {R、I} $、それは$ L $ $ R $に達することができる場合。それは、すべての出力FOUのために動作しません。

時間複雑さの$ O $(N ^ 2N + Q \ログnのログ\)

1の#include <ビット/ STDC ++ H>
 2  の#define RINTレジスタINT
 3  使用して 名前空間STDを、
4  のconst  int型 N = 300001 5  int型 N、M、F [N]、[ 19 ]、G [N] [ 19 ]。
6  BOOL [N] [ 19 ]。
7  INT メイン(){
 8      のscanf(" %d個の%のD "、&​​N、&M)。
9      (RINT i = 1 ; iが<= N iが++ ){
 10          INT X。
11         scanf関数(" %のD "、&x)は、
12          のための(RINTのJ = 0 ; J < 19 ; J ++ 13              であれば(X&(1 << J))[I] [J] = 1 14      }
 15      (RINT i = 1 ; iが<= N; iが++ 16          のための(RINTのJ = 0 ; J < 19 ; J ++ 17              であれば([I - 1 ] [J])[G I] [J] = I - 1 18               G [I] [J] = G [I - 1 ] [J]。
19      のために(RINT i = 1 ; iが<= N; iが++ 20          のための(RINTのJ = 0 ; J < 19 ; J ++ 21              のための(RINTのK = 0 ; <K 19 ; kは++ 22                  もし([I] [K]){
 23                      、INT X = G [i]が[K]。
24                      F [I] [J] = MAX(F [I] [J]、F [x]は[J])。
25                      であれば([X] [J])F [I] [J] = MAX(F [I] [J]、X)。
26                  }
 27      ながら(M - ){
 28          のint L、R。
29          BOOL ANS = ;
30          のscanf(" %dの%のD "、&​​L&R)。
31          のために(RINT i = 0 ; iは< 19!を&& ANS; I ++ 32              であれば([L] [I] && F [R] [I]> = 1)ANS = 33の          プット(ANS?" "" Fouの" );
34      }
 35 }
CF1168C

 

おすすめ

転載: www.cnblogs.com/AThousandMoons/p/11116726.html