小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行,每行兩個整數l、r。
1<=n、m、k<=50000
m行,每行乙個整數,其中第i行的整數表示第i個詢問的答案。
6 4 31 3 2 1 1 3
1 42 6
3 55 6
6 //在區間[1..4]]之間,1出現了2次,2和3分別出現1次,於是結果=4+1+1=6951莫隊演算法2
2因為是求出sigma(c(i)^2)的值,所以在模板上要改進一下
#includeusingnamespace
std;
long
long n,m,cnt[200000],ans,k,num[1000001],l,r,anss[200001
];struct
data a[
200001
];bool
cmp(data c,data d)
//莫隊排序
void add(long
long
xx)void del(long
long
xx)void dowork(long
long
x)//
莫隊板子
intmain()
for(long
long i=1;i<=m;i++)
sort(a+1,a+m+1
,cmp);
for(long
long i=1;i<=m;i++)
for(long
long i=1;i<=m;i++)
printf(
"%lld\n
",anss[i]);
}
小B的詢問
這裡不講莫隊的思路,各路大神已經講清楚了。我們講一下如何卡常。把正常的莫隊交上去,記錄。單個點 1784ms 把每一次詢問的右邊界 right i 從小到大改為從打到小,快了了一點。注意要把陣列開小點。1522ms 如果分為 trunc sqrt n 塊不好,然後分別試著分為 n 6 和 n 10 ...
莫隊 小B的詢問
莫隊經典例題 這題詢問每一種數字數量的平方和,那麼我們在左移或右移的時候記錄一下就好了,當每一種數字的種類數加1或減1的時候,我們需要減去以前這個數對答案的影響,加上現在對答案的影響。假設原來數字a的種類數為k,如今又加入乙個a,那麼先ans k2,然後ans k 1 2.刪除同理。include ...
BZOJ 3781 小B的詢問
description 小b有乙個序列,包含n個1 k之間的整數。他一共有m個詢問,每個詢問給定乙個區間 l.r 求sigma c i 2 的值,其中i的值從1到k,其中c i 表示數字i在 l.r 中的重複次數。小b請你幫助他回答詢問。題目分析 分塊 include include include...