luogu P4887のMo二オフラインチーム

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])。
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/11592743.html