GukiZとGukiZiana CodeForces - 551E(分块)

効果:プラスの範囲、最も遠い距離要素の$ X $の全体のクエリー配列。

 

素晴らしい時間、無脳$ O(n個の\ SQRT {n}はLOGN)$ブロック。

書式#include <iostreamの> 
の#include <sstream提供> 
する#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <math.h>の
書式#include <設定> 
書式#include <マップ> 
書式#include <キュー> 
の#include <string>に
する#include < string.hの> 
の#include <ビットセット> 
の#define REP(I、N)のために(INT iは=; I <= N; ++ I)
の#define PER(I、N)のための(iはint型= N; I> = 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の第二
のstd :: IOS IOの#defineを::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、P2 = 998244353、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 = 1E6 + 10。
INTのN、M、SQN、[N]。
INT BLO [N]、L [N]、R [N]、タグ[N]。
ベクター<INT> G [N]。

	REP(I、L [ID]、R [ID])[I] =分(INF、[I] +タグ[ID])。
	REP(I、L、R)[I] =分(INF、[I] + V)。
	G [ID] .clear()、タグ[ID] = 0; 
	REP(I、L [ID]、R [ID])G [ID] .pb([I])。
	ソート(G [ID] .begin()、G [ID] .END())。
} 

ボイド更新(int型のL、R INT、INT V)、{ 
	IF(BLO [L] == BLO [R])を構築(L、R、V、BLO [L])。
	他{ 
		(L、R [BLO [L]、V、BLO [L])を構築します。
		(L [BLO [R]、R、V、BLO [R])を構築します。
		REP(I、BLO [L] + 1、BLO [R] -1)タグ[I] =分(INF、タグ[I] + V)。
	} 
} 

int型クエリ(INT X)、{ 
	INT QR = 0、QL = 1。
	REP(I、1、BLO [N]){ 
		オートT = LOWER_BOUND(G [i]が.begin()、G [i]は.END()、Xタグ[I])。
		IF(!T = G [i]が.END()&& *さt == X-タグ[I]){ 
			(iは0,0,0)を構築します。
			REP(J、L [i]は、R [i])とIF([J] == X){
		R [BLO [I] = BLO [I] * SQN。
				QL = J; ブレーク; 
			} 
			ブレーク; 
		} 
	} 
	PER(I、1、BLO [N]){ 
		オートT = UPPER_BOUND(G [i]が.begin()、G [i]は.END()、Xタグ[I])。
		IF(!T = G [i]が.begin()&& *( - T)== X-タグ[I]){ 
			(私を0,0,0)を構築します。
			PER(J、L [i]は、R [i])とIF([J] == X){ 
				QR = J。ブレーク; 
			} 
			ブレーク; 
		} 
	} 
	戻りQR-QL。
} 

int型のmain(){ 
	scanf関数( "%D%dの"、&N、&M)。
	SQN = POW(N、0.44)。
	REP(I、1、N){ 
		scanf関数( "%dの"、A + I)。
		BLO [I] =(I-1)/ SQN + 1。
		G [BLO [I] PB([I])。
		L [BLO [I] =(BLO [I] -1)* SQN + 1。 
	REP(I、1、BLO [N])ソート(G [i]が.begin()、G [i]は.END())。
	}
	一方、(M--){ 
		int型OP、L、R、X、
		scanf関数( "%のD"、&OP)。
		IF(OP == 1){ 
			scanf関数( "%D%D%D"、&L&R&X)。
			アップデート(L、R、X)。
		} 
		他{ 
			scanf関数( "%のD"、&x)は、
			printf( "%d個の\ n"、クエリ(X)); 
		} 
	} 
}

 

おすすめ

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