題幹
這個是用來學莫隊的例題,洛谷詳解
需要注意的一點,一定要分塊!不然會慢很多(直接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 可能是我打的不夠優美 又突然想到這道題貌似沒有修改,於是就打了乙個不帶修改的莫隊 首先,...