樹狀陣列 BZOJ1878 HH的項鍊

2021-07-16 15:32:28 字數 1465 閱讀 3889

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此, 他的項鍊變得越來越長。有一天,他突然提出了乙個問題:某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。。。因為項鍊實在是太長了。於是,他只好求助睿智的你,來解 決這個問題。

第一行:乙個整數n,表示項鍊的長度。 第二行:n個整數,表示依次表示項鍊中貝殼的編號(編號為0到1000000之間的整數)。 第三行:乙個整數m,表示hh詢問的個數。 接下來m行:每行兩個整數,l和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。

m行,每行乙個整數,依次表示詢問對應的答案。

6 1 2 3 4 3 5

3 1 2

3 5

2 6

2 2

4 對於20%的資料,n ≤ 100,m ≤ 1000;

對於40%的資料,n ≤ 3000,m ≤ 200000;

對於100%的資料,n ≤ 50000,m ≤ 200000。

day2

這是乙個經典問題,詢問區間內不同數字的個數。

考慮單個詢問,掃瞄在右端點左邊的數字。對於每乙個數字,我們只需要將1~他最後出現的位置之間進行區間加一,最後我們只需要求出在左端點那個位置的值即可。

這個可以用樹狀陣列來解決。

我們將詢問按照右端點排序。

然後對應每乙個數字ai

,我們預處理出li

,即上一次出現與ai

數值相等的位置+1。當我們掃瞄到乙個數字時,我們只需要對[l

i,i]

區間+1即可。在樹狀陣列中的操作就是在li

處+1,i+

1 處-1。

#include

#include

#define maxn 50000

#define maxm 200000

#define maxv 1000000

using

namespace

std;

int n,m,la[maxv+10],l[maxn+10],c[maxn+10],a[maxn+10],ans[maxm+10];

inline

int lowbit(int &x)

void update(int x,int d)

}int get_sum(int x)

return ret;

}struct query

}void read()

read(m);

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

read(q[i].l),read(q[i].r),q[i].pos=i;

}void solve()

ans[q[i].pos]=get_sum(q[i].l);

}}void print()

int main()

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...

BZOJ 1878 HH的項鍊(離線樹狀陣列)

includeusing namespace std const int maxn 1000000 500 const int maxm 200000 500 int c maxn a maxn int p maxn next maxn struct node que maxm bool cmp1 ...

BZOJ 1878 HH的項鍊(樹狀陣列 離線)

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是,...