bzoj5016 乙個簡單的詢問

2022-02-05 10:10:05 字數 1362 閱讀 5570

這種不可直接做的問題

資料範圍又很小

考慮莫隊

但是,l1,l2,r1,r2四維?

考慮把詢問二維差分!

f(a,b)表示,詢問[1,a],[1, b]的答案

所以,ans(l1,r1,l2,y2)=f(r1,r2)-f(l1-1,r2)-f(r1,l2-1)+f(l1-1,l2-1)

正確性的話,考慮每乙個種類k被統計的情況,c*d=(a+b)*(c+d)-a*(c+d)-c*(a+b)+a*b

需要離散化

陣列開4倍

#include#define il inline

#define reg register int

#define numb (ch^'0')

using

namespace

std;

typedef

long

long

ll;il

void rd(int &x)

namespace

miracle

que(

int ll,int rr,int cc,int

dd)

bool friend operator

<(que a,que b)

return blo[a.l]}

}q[4*n];

inttot;

int buc[2

][n];

ll now;

intl,r;

void dele(int d,int

c)void add(int d,int

c)void

modui()

}int

main()

sort(b+1,b+n+1

);

int cnt=unique(b+1,b+n+1)-b-1

;

for(reg i=1;i<=n;++i)

rd(m);

intl1,l2,r1,r2;

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

sort(q+1,q+tot+1

); modui();

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

return0;

}}signed main()

/*author: *miracle*

date: 2019/1/27 22:24:01

*/

詢問的二維拆分有點意思!

以前並沒有遇到這種問題(最多就是一維差分)

之前莫隊都是(l,r)這種

如果可以字首差分的話,那麼多個(li,ri)都是可以的

本質就是容斥,或者高維差分

乙個簡單的詢問 HYSBZ 5016

給你乙個長度為n的序列ai,1 i n和q組詢問,每組詢問讀入l1,r1,l2,r2,需輸出 get l,r,x 表示計算區間 l,r 中,數字x出現了多少次。input 第一行,乙個數字n,表示序列長度。第二行,n個數字,表示a1 an 第三行,乙個數字q,表示詢問個數。第4 q 3行,每行四個數...

BZOJ5016 Snoi2017 乙個簡單的詢問

題面 bzoj 這題的ider挺有意思的。看看資料範圍,多半是莫隊,但直接統計答案又不行 有4個引數啊 來拆式子,設 q i,j sum cnt 0.i x times cnt 0.j x 這個是可以用莫隊做的,那怎麼用它把題中的式子表示出來呢?有 ans l1,r1,l2,r2 sum cnt l...

SNOI2017 乙個簡單的詢問

給定乙個長度為 n n le50000 的序列 a 1 le a i le n 定義 operatorname l,r,x 為區間 a 中 x 的出現次數。m m le50000 次詢問,每次給出 l 1,r 1,l 2,r 2 求 sum operatorname l 1,r 1,x cdot o...