トピックリンク:羅区
説明タイトル:$私は<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 }