bzoj 3809 莫隊 分塊求和

2021-07-13 17:25:11 字數 1865 閱讀 1068

time limit: 80 sec  

memory limit: 28 mb

submit: 1185  

solved: 330 [

submit][

status][

discuss]

autumn和bakser又在研究gty的妹子序列了!但他們遇到了乙個難題。

對於一段妹子們,他們想讓你幫忙求出這之內美麗度∈[a,b]的妹子的美麗度的種類數。

為了方便,我們規定妹子們的美麗度全都在[1,n]中。

給定乙個長度為n(1<=n<=100000)的正整數序列s(1<=si<=n),對於m(1<=m<=1000000)次詢問「l,r,a,b」,每次輸出sl...sr中,權值∈[a,b]的權值的種類數。

第一行包括兩個整數n,m(1<=n<=100000,1<=m<=1000000),表示數列s中的元素數和詢問數。

第二行包括n個整數s1...sn(1<=si<=n)。

接下來m行,每行包括4個整數l,r,a,b(1<=l<=r<=n,1<=a<=b<=n),意義見題目描述。

保證涉及的所有數在c++的int內。

保證輸入合法。

對每個詢問,單獨輸出一行,表示sl...sr中權值∈[a,b]的權值的種類數。

10 10

4 4 5 1 4 1 5 1 2 1

5 9 1 2

3 4 7 9

4 4 2 5

2 3 4 7

5 10 4 4

3 9 1 1

1 4 5 9

8 9 3 3

2 2 1 6

8 9 1 420

0211

1012

解題思路:

首先莫隊,然後剩下就是如何統計顏色了,這裡樹狀陣列要超時,可以用分塊(太勝了)

#include

#include

#include

#include

#include

using namespace std;

int n,m,opp,lnow,rnow;

struct ss

q[1000011];

int pos[100100],sum[100100],shu[100100],s[100100];

int ans[1000010];

inline int read()

while (y>='0' && y<='9')

return x*f;

}bool cmp(ss x,ss y)

for (int i=pos[st]+1;i<=pos[en]-1;++i)

for (int i=st;i<=pos[st]*opp;++i)

if (shu[i]>=1) ++sug;

for (int i=(pos[en]-1)*opp+1;i<=en;++i)

if (shu[i]>=1) ++sug;

return sug;

}void dfs()

int main()

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

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

lnow=1; rnow=n;

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

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

while (lnowq[i].l)

while (rnowq[i].r)

ans[q[i].dui]=query(q[i].a,q[i].b);

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

{cout<

bzoj3809 莫隊 分塊

題目大意 給出乙個序列和m個詢問,每個詢問求 l,r 中權值 a,b 的權值的種類數。由於詢問是離線的,考慮莫隊。顯然可以用修改和查詢為o log2n 的樹狀陣列維護權值種類數,但這種做法的總時間複雜度是o n sqrt n log2m 可能會tle。注意到總共有o m 個查詢 o n sqrt n...

bzoj3585 莫隊 分塊

description 有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。input 第一行n,m。第二行為n個數。從第三行開始,每行乙個詢問l,r。output 一行乙個數,表示每個詢問的答案。sample input 5 52 1 0 2 1 3 32 3 2 41 2 ...

bzoj3585 mex 莫隊 分塊

ac通道 題解 這題思維上有些難度,蒟蒻不得不 了popoqqq大爺題解。將1 n之間的自然數分成根號n塊,每個塊記錄當前塊中已經出現的不同的自然數的個數。那麼在查詢時只需要檢驗每個塊是否滿足r i l i 1 blo i 找到第乙個不滿足以上條件的,然後在該塊內暴力查詢即可。bzoj 3585 b...