洛谷P5268 乙個簡單的詢問

2021-09-29 06:23:03 字數 1937 閱讀 1982

傳送門 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個整數...