洛谷P2709 小B的詢問 莫隊做法

2022-09-20 15:06:13 字數 980 閱讀 6339

題幹

這個是用來學莫隊的例題,洛谷詳解

需要注意的一點,一定要分塊!不然會慢很多(直接tle)

其中分塊只在排序的時候要用,並且是給問題右端點分塊

再就是注意add與del函式裡的操作,增加數量不提,ans的加減可以用完全平方公式推出

上**:

#include#include

#include

#include

#define num 50010

using

namespace

std;

intn,m,k;

long

long ans,blo;//

當前的答案,每個塊內點的數量

inta[num];

long

long sum[num],anss[num];//

每個數的出現次數,對於每個問題的對應答案

struct

wen;

wen q[num];

void add( int

x )void del( int

x )bool

cmp( wen gu1,wen gu2 )

intmain()

blo =sqrt(n);

sort( q+1,q+m+1

,cmp );

long

long l = 1,r = 0

,ql,qr;

for( int i = 1;i <= m;i++)

while( r >qr )

//因為add函式是從a^2 = (a-1)^2 + 2a -1,所以先位移再跑函式

while( l >ql )

while( r anss[q[i].num] =ans;

}for( int i = 1;i <= m;i++)

cout

<< anss[i]

}

洛谷P2709 小B的詢問 莫隊

按根下n分個塊,對詢問區間雙關鍵字排序,若不在乙個塊裡按左端點排序,若在按右端點排序,然後掃一遍統計答案 考慮每次移動指標後答案的改變 分為四種情況 分別是l,r指標在查詢區間的l和r的左邊還是右邊,都討論一下 每種情況該怎麼做在紙上畫畫就明白了。沒必要特意記 include include inc...

洛谷 P2709 小B的詢問 (莫隊)

小b有乙個序列,包含n個1 k之間的整數。他一共有m個詢問,每個詢問給定乙個區間 l.r 求sigma c i 2 的值,其中i的值從1到k,其中c i 表示數字i在 l.r 中的重複次數。小b請你幫助他回答詢問。第一行,三個整數n m k。第二行,n個整數,表示小b的序列。接下來的m行,每行兩個整...

莫隊,分塊 洛谷P2709 小B的詢問

給定乙個長度為 n n 的序列,m role presentation m m次詢問,詢問 1.k 1.k 的所有數在l.rl r中出現了幾次,求它們的平方和 樸素演算法tl e tle 線段樹tl e tle 可能是我打的不夠優美 又突然想到這道題貌似沒有修改,於是就打了乙個不帶修改的莫隊 首先,...