P2709 小B的詢問 莫隊

2021-08-21 17:46:47 字數 1425 閱讀 4772

題目描述

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

輸出格式

m行,每行乙個整數,其中第i行的整數表示第i個詢問的答案。

輸入輸出樣例

輸入樣例#1: 複製

6 4 3

1 3 2 1 1 3

1 4

2 6

3 5

5 6

輸出樣例#1: 複製

6 9 5 2

分析:

莫隊演算法(暴力):適用於多次區間查詢問題,且由[l

,r] [l,

r]

能推到[l

−1,r

] [l−

1,r]

,[l+1,r

] [l+

1,r]

,[l,r−1

] [l,

r−1]

,[l,r+1

] [l,

r+1]

. 其實就是把查詢排序,由於相鄰之間有關係,查詢區間盡可能相近,移動步數就較少,複雜度n∗

sqrt

(n) n∗s

qrt(

n)

.

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

intconst size = 60100;

intconst block_size = 250; //分塊的大小

int a[size], cnt[200010] = ;

ll ans[200010];

int n, q, k;

ll sum;

struct nodeb[50010];

bool

operator

< (node const& x,node const& y)

inline

void insert(int x)

inline

void remove(int x)

void modui()

for(int i = 0; i < q; ++i) printf("%lld\n", ans[i]);

}void read()

}int main()

P2709 小B的詢問 莫隊

題面只要能想出 o 1 的方式轉移 l,r 莫隊就不難了。此題求區間 sum kcnt i 2 那我們就 o 1 更新就好了,先減去原來的貢獻,更新cnt再加上現在的貢獻,這樣就更新完了。注意 莫隊小心初始化,直接l 0,r 0等可能會炸。include include include define...

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的序列。接下...

P2709 小B的詢問 莫隊演算法

莫隊演算法被稱為優雅的暴力,是一種 毒瘤暴力的 區間操作演算法。初學莫隊,記錄一下思想。對於多個區間查詢 l,r 這類問題,可以離線操作,常規做法還有對左區間或者右區間從小到大排序,讓左指標或者右指標只走一遍,有效降低時間複雜度。但是遇到 1,1000000 2,3 3,1000000 4,5 5,...