題意:小b有乙個序列,包含n個1~k之間的整數。他一共有m個詢問,每個詢問給定乙個區間[l…r],求σ(c
(i)2
)\sigma(c(i)^2)
σ(c(i)
2)的值,其中i的值從1到k,其中c(i)表示數字i在[l…r]中的重複次數。對於每個區間詢問,輸出乙個σ(c
(i)2
)\sigma(c(i)^2)
σ(c(i)
2);分析:
莫隊分三種,普通莫隊,樹上莫隊,帶修改莫隊;
莫隊是離線操作,比較好的優化是分塊;
個人理解:什麼是莫隊演算法呢,莫隊演算法即是對區間問題的處理與求解;
首先它的核心是這樣乙個東西,如果你知道乙個區間[l,
r]
[l,r]
[l,r
]的結果(具體什麼結果看題目要求),那麼一般來說顯然你可以o(1
)o(1)
o(1)
得到[ l,
r−1]
,[l−
1,r]
,[l+
1,r]
,[l,
r+1]
[l,r-1],[l-1,r],[l+1,r],[l,r+1]
[l,r−1
],[l
−1,r
],[l
+1,r
],[l
,r+1
]這些的區間的結果;
莫隊這裡就是定義兩個指標lef
t,ri
gh
tleft,right
left,r
ight
,用來指向你所要處理或者查詢區間的左右端點,然後你讓這兩個指標指向你所要處理的一堆區間中的某個區間左右端點,當你處理完第乙個,使用它的結果並利用指標的++,
−−
++,--
++,−
−操作,來移動指標,利用上面的所說的思想,一點一點o(1
)o(1)
o(1)
得到你想要的區間結果,即移動left,right直到它們恰好移動到你所需要的區間做右端點;(不理解沒關係,做兩道題目就差不多了);
那麼你顯然會覺得這很暴力,正常來寫,一般都會tle;在這個過程中你會想到在指標移動的過程中的時間開銷是非常大的,你會想到把查詢的區間按左端點排個序,然而這樣考慮過於極端,如果有這樣的區間[1,
100000],
[2,3
],[3
,100000
][1,100000],[2,3],[3,100000]
[1,100
000]
,[2,
3],[
3,10
0000
],如果這樣,你顯然也會tle;然後有些人就有了更加amazing的idea,分塊,優先將區間按左端點所在塊排序,其次按照區間右端點排序,經計算可得(我不會證明= =),當以n
\sqrt
n進行分塊時,將會達到乙個最優的時間複雜度n
1.5\sqrt}
n1.5
,這就是普通莫隊
(易理解)
**:
我們堅持一件事情,並不是因為這樣做了會有效果,而是堅信,這樣做是對的。#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define inf 0x7f7f7f7f
#define maxn 50009
#define n 2
#define mod 100003
typedef
long
long ll;
typedef
struct
edge;
edge e[n]
;int cnt, head[n]
;inline
void
add(
int u,
int v)
inline
void
write
(int x)
inline
intread()
while
(c >=
'0'&& c <=
'9')
return x * f;
}struct nodep[maxn]
;int an,n,m,k,a[maxn]
,pos[maxn]
,ans[maxn]
,c[maxn]
;void
update
(int x,
int val)
bool
com(node a,node b)
intmain()
for(
int i=
1;i<=m;i++
)sort
(p+1
,p+1
+m,com)
;int l=
1,r=0;
for(
int i=
1;i<=m;i++
)while
(r.r)while
(l.l)while
(r>p[i]
.r) ans[p[i]
.id]
=an;
}for
(int i=
1;i<=m;i++
)return0;
}
——哈維爾
洛谷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的詢問
傳送門 題目描述 小b有乙個序列,包含n個1 k之間的整數。他一共有m個詢問,每個詢問給定乙個區間 l.r 求sigma c i 2 的值,其中i的值從1到k,其中c i 表示數字i在 l.r 中的重複次數。小b請你幫助他回答詢問。輸入輸出格式 輸入格式 第一行,三個整數n m k。第二行,n個整數...