這種不可直接做的問題
資料範圍又很小
考慮莫隊
但是,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...