入門oj 6492 小B的詢問

2022-05-11 02:57:38 字數 1042 閱讀 2213

小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 3

1 3 2 1 1 3

1 42 6

3 55 6

6 //在區間[1..4]]之間,1出現了2次,2和3分別出現1次,於是結果=4+1+1=695

2

1莫隊演算法

2因為是求出sigma(c(i)^2)的值,所以在模板上要改進一下

#includeusing

namespace

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...