洛谷 P2709 小B的詢問 (莫隊)

2021-09-28 14:08:47 字數 1673 閱讀 9227

小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 42 6

3 55 6

輸出 #1複製

695

2

對於全部的資料,1<=n、m、k<=50000

題目大意 : 輸入長度為 n 的序列, 有m 次查詢,  每次查詢某個區間內, 輸出所有數的出現次數的平方和

accepted code

#include#includeusing namespace std;

#define sc scanf

#define ls rt << 1

#define rs ls | 1

#define min(x, y) x = min(x, y)

#define max(x, y) x = max(x, y)

#define all(x) (x).begin(),(x).end()

#define sz(x) ((int)(x).size())

#define mem(x, b) memset(x, b, sizeof(x))

#define lowbit(x) ((x) & -(x))

#define p2(x) ((x) * (x))

typedef long long ll;

const int mod = 1e9 + 7;

const int maxn = 1e5 + 100;

const int inf = 0x3f3f3f3f;

inline ll fpow(ll a, ll b)return r; }

struct node

e[maxn];

int p[maxn], belong[maxn], n, m, k;

int num[maxn], sz, sum, l = 1, r;

ll pre[maxn], ans;

bool cmp(node a, node b)

void add(int x)

void del(int x)

int main()

for (int i = 1; i <= n; i++) sc("%d", &p[i]);

for (int i = 1; i <= m; i++) sc("%d %d", &e[i].l, &e[i].r), e[i].x = i;

sort(e + 1, e + m + 1, cmp);

for (int i = 1; i <= m; i++)

for (int i = 1; i <= m; i++) printf("%lld\n", pre[i]);

return 0;

}

洛谷P2709 小B的詢問 莫隊

按根下n分個塊,對詢問區間雙關鍵字排序,若不在乙個塊裡按左端點排序,若在按右端點排序,然後掃一遍統計答案 考慮每次移動指標後答案的改變 分為四種情況 分別是l,r指標在查詢區間的l和r的左邊還是右邊,都討論一下 每種情況該怎麼做在紙上畫畫就明白了。沒必要特意記 include include inc...

莫隊,分塊 洛谷P2709 小B的詢問

給定乙個長度為 n n 的序列,m role presentation m m次詢問,詢問 1.k 1.k 的所有數在l.rl r中出現了幾次,求它們的平方和 樸素演算法tl e tle 線段樹tl e tle 可能是我打的不夠優美 又突然想到這道題貌似沒有修改,於是就打了乙個不帶修改的莫隊 首先,...

洛谷P2709 小B的詢問 基礎莫隊

洛谷p2709小b的詢問 void add int x void remove int x 這兩個函式都是用來處理l,r指標移動時對答案的貢獻,x是移走 來的點的id for int i 1 i m i 下面是預處理 int len sqrt n query i k query i l 1 len ...