bzoj 3809 Gty的二逼妹子序列

2021-08-13 20:30:04 字數 1312 閱讀 4460

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]的權值的種類數。

第一遍寫了樹狀陣列,每次單點加1,區間查詢,複雜度n 根號n logn,折騰好久怎麼優化都沒過,就去剛n根號n的正解了。

為了使得我們的總複雜度為n根號n,每次修改必須是o(1))的,所以我們可以考慮在莫隊之後,再對數字進行分塊,用cnt陣列輔助記錄每個數字出現了多少次。如果當前數字是第一次出現就給它所在的塊的答案就加一,如果cnt被減到0了,那麼就給所在塊的答案-1,這樣保證了每次修改是o(1)的了。

接著我們還需要很快的查詢區間的答案,由於我們已經事先分好了塊,所以直接查詢區間和單點都不會超過根號n個,所以直接大區間查詢塊的答案,單點判斷是否為0即可每次在根號n的時間內查詢,由於每一次列舉只會查詢一次所以總複雜度還是n根號n。

下附ac**。

#include#include#include#include#include#include#define maxn 100005

using namespace std;

inline int read()

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

return x*f;

}int n,m,q;

struct nod

query[maxn*10];

int a[maxn],ans[maxn*10];

int cnt[maxn],cntbel[maxn];

int bel[maxn],l[maxn],r[maxn];

bool operator< (nod a,nod b)

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

printf("%d\n",ans[i]);

}

BZOJ3809 Gty的二逼妹子序列

空間這麼小 然後就莫隊了 不知道三維kd tree能不能過 本來想打bit,結果發現過不了的樣子,因為修改比較多,詢問比較少,所以可以考慮平衡複雜度,用分塊維護 單次修改o 1 詢問o n code include include include include include include in...

bzoj3809 Gty的二逼妹子序列

先說一種很顯然的做法,大體框架肯定是莫隊,然後每來一種顏色就處理下,如果是新出現的就在bit當中把這個位置 1,如果這種顏色消失了就在bit中對應位置 1。這樣的時間複雜度是o nn log 2n 我交了一次發現超時了。那怎麼辦?觀察下,我們查詢和修改的複雜度都是o logn 但是顯然查詢的次數要遠...

BZOJ3809 Gty的二逼妹子序列

bzoj3809 gty的二逼妹子序列 又是一道許可權題。本蒟蒻沒錢氪金。附上洛谷題面 洛谷p4867 gty的二逼妹子序列 autumn和bakser又在研究gty的妹子序列了!但他們遇到了乙個難題。對於一段妹子們,他們想讓你幫忙求出這之內美麗度 in a,b a,b 的妹子的美麗度的種類數。為了...