傳送門 to luogu
首先它是個莫隊的題。(為什麼?我也不知道 ?)
但是莫隊只能處理兩個變數的詢問(並且任意乙個變數的移動對答案的影響可以快速計算,一般是 o(1
)\mathcal o(1)
o(1)
)。所以只好把這個式子變換一下。記 f(m
,x)=
∑j=1
m[aj
=x
]f(m,x)=\sum_^[a_j=x]
f(m,x)
=∑j=
1m[
aj=
x],則=∑x
=0∞g
et(l
1,r1
,x)⋅
get(
l2,r
2,x)
=[f(
r1,x
)−f(
l1−1
,x)]
⋅[f(
r2,x
)−f(
l2−1
,x)]
=f(r
1,x)
⋅f(r
2,x)
+⋯
\begin &=\sum_^get(l_1,r_1,x)\cdot get(l_2,r_2,x)\\ &=[f(r_1,x)-f(l_1-1,x)]\cdot[f(r_2,x)-f(l_2-1,x)]\\ &=f(r_1,x)\cdot f(r_2,x)+\cdots \end
=x=0∑
∞ge
t(l1
,r1
,x)
⋅get
(l2
,r2
,x)=
[f(r
1,x
)−f(
l1−
1,x)
]⋅[f
(r2
,x)−
f(l2
−1,
x)]=
f(r1
,x)
⋅f(r
2,x
)+⋯
我實在是不想打啦 全部打出來太長了。
反正這樣就變成兩個變數啦!
#include
#include
#include
#include
using
namespace std;
const
int maxn =
50000
, sqrtn =
230;
int n, q, a[maxn]
;struct query
query
(int l,
int r,
int i):l
(l),
r(r),id
(i)bool
operator
<
(const query &that)
const
}query[maxn<<2]
;void
init()
sort
(query,query+
(q<<2)
);}long
long ans;
long
long answer[maxn]
;int cnt[maxn][2
];void
add(
int id,
int f)
void
release
(int id,
int f)
voidmo(
)for
(int i=
0; i++i)
printf
("%lld\n"
,answer[i]);
}int
main()
P5268 乙個簡單的詢問(莫隊 容斥)
給你乙個長度為 n n 的序列 aia i,1 i n1 i n,和 q q 組詢問,每組詢問讀入 l1,r1,l 2,r2 l1,r 1,l2 r2,需輸出 x 0 get l 1,r1 x get l2 r2,x x 0 get l 1,r1 x get l2 r2,x get l,r,x ge...
洛谷P5286 乙個簡單的詢問
給你乙個長度為 n 的序列 a i 1 leq i leq n 和 q 組詢問,每組詢問讀入 l 1,r 1,l 2,r 2 需輸出 sum limits infty text l 1,r 1,x times text l 2,r 2,x text l,r,x 表示計算區間 l,r 中,數字 x 出...
洛谷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個整數...