Keduo李は、$を$に$ [L、R] $の範囲に各クエリをシーケンスを与えました
クエリの$l≤i<j≤r$、$ai⊕ajと$ $バイナリ表現で$ K $ $ $ 1組$(i、j)の数を有しています。$の⊕$は、ビット単位の排他的論理和を指します。
MOチーム直接暴力ワード複雑性の$ O(N \のSQRT {M} \ binom {14} {7})$、チームアプローチMO二オフラインであります
考えてみましょうMoのチームのプロセスは、現在のメンテナンス間隔の$ [QL、QR] $を前提としてい
$器R $を右ポイントならば、答えはインクリメンタルであります
$ \和\ limits_ {K = QR + 1} ^ RF(K、[QL、K-1])= \和\ limits_ {K = QR + 1} ^ RF(K、[1、K-1]) - \和の\ limits_ {K = QR + 1} ^ RF(K、[1、QL-1])$
$ F(K、[1、K-1])$は、$のF(K、[1、QL-1])の走査線後$オフラインて前処理することができます。
総複雑性は$ O(n個の\ SQRT {M} + N \ binom {14} {7})$です
書式#include <iostreamの> の#include <sstream提供> する#include <アルゴリズム> 書式#include <cstdioを> する#include <cmath> の#include <設定> 書式#include <マップ> 書式#include <キュー> の#include <文字列> の#include <CStringの> #include <ビットセット> の#include <機能> の#include <ランダム> の#define REP(I、N)のために(INT iは=、iが<= N; ++ I) の#define PER(I、N )(I = N int型のために、私は> = A; - I) の#defineのHRのputchar(10) の#define PB一back の#define LC(O << 1) の#define RC(LC | 1) の#define中旬(( L + R)>> 1) の#define LSのLC、L、中 の#define RSのRC、ミッド+ 1、R の#define X最初 の#define Y秒 の#define IOのstd :: IOS :: sync_with_stdio(偽) の#define ENDL '\ N' の#define DB(A)({REP(__ I、1、n)はCOUT << [__ I] << '';時間;}) 名前空間stdを使用。 typedefの長い長いLL。 typedefのペア<int型、int型> PII。 CONST int型P = 1E9 + 7、INF = 0x3f3f3f3f。 LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} ?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} //ヘッド のconst int型N = 1E5 + 10。 CONSTの整数M = 1 << 14。 N INT、M、K、SQN、CNT。 [N] INT、BLO [N]、[N] F。 構造体_ { int型のL、R、ID。CNT)は、予め[I] + = VIS [F [J] ^ [I]]。 ++ VIS [[I]]; ANS LL; ブール演算子<(CONST _&RHS)のconst { ?戻りBLO [L] ^ BLO [rhs.l] L <rhs.l:BLO [L]&1 R <rhs.r:R> rhs.r。 } }、Q [N]。 ベクター<_> G [N]。 LL ANS [N]。 INT VIS [N]、[N]を事前。 INTメイン(){ scanf関数( "%D%D%D"、&N、&M、およびK); SQN = POW(N、0.55)。 REP(I、1、N)のscanf( "%dの"、A + I)、BLO [I] = I / SQN。 REP(I、1、M){ scanf関数( "%d個の%のD"、&Q [i]は.L&Q [I] .R)。 Q [i]はiは= .ID。 } もし(K> 14){ REP(I、1、m)のプット( "0")。 0を返します。 } REP(I、0、M-1)++ CNT] = I F(__builtin_popcount(I)== k)があれば、 REP(I、1、N){ REP(J、1、CNT)予め[I] + = VIS [F [J] ^ [I]]。 INT QL = 1、QR = 0。 REP(I、1、M){ int型L = Q [i]が.L、R = Q [i]は.R。 IF(QL <L)G [QR] .pb({QL、L-1、-i})。 (QL <L)Q [i]は.ans + =事前[QL ++]一方 (QL> L)G [QR] .pb({1、QL-1、I})であれば、 一方、(QL> L)Q [i]は.ans- =プレ[ - QL]。 IF(QR <R)G [QL-1] .pb({QR + 1、R、-i})。 一方、(QR <R)Q [i]は.ans + =事前[++ QR]。 IF(QR> R)G [QL-1] .pb({R + 1、QR、I})。 一方、(QR> R)Q [i]は.ans- =プレ[qr--]。 } REP(I、0、M-1)VIS [I] = 0; REP(I、1、N){ REP(J、1、CNT)++ VIS [I] ^ F [J]。 (オート&T:G [i])とするための{ REP(J、TL、TR){ int型RET = VIS [J]。 (!J <= I && k)の場合--ret。 IF(t.id <0)Q [-t.id] .ans- = RET。 他Q [t.id] .ans + = RET。 REP(I、1、M)Q [i]は.ans + = Q [I-1] .ans。 REPは、(i、1、m)は、[Q [i]は.ID] = Q [i]は.ansをANS。 REP(I、1、M)のprintf( "%のLLDを\ n"、ANS [I])。 }