洛谷P1972 SDOI2009 HH的項鍊

2022-06-03 22:18:12 字數 1520 閱讀 1339

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

輸入格式:

第一行:乙個整數n,表示項鍊的長度。

第二行:n 個整數,表示依次表示項鍊中貝殼的編號(編號為0 到1000000 之間的整數)。

第三行:乙個整數m,表示hh 詢問的個數。

接下來m 行:每行兩個整數,l 和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。

輸出格式:

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

輸入樣例#1:

6

1 2 3 4 3 5

31 2

3 52 6

輸出樣例#1:

2

24

資料範圍:

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

先把所有的區間按照左端點排序,從左到右掃。

對於區間左面的點,因為已經沒有用了,那麼它的下乙個和它顏色相同的點個數加1。

#include#include

#include

#include

using

namespace

std;

const

int maxn=50000+5

;const

int maxm=200000+5

;inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}int n,m,mx,x=1

;int a[maxn],c[maxn],nxt[maxn],head[1000005

],ans[maxm];

struct

node

}q[maxm];

inline

void update(int x,int

k)inline

int getsum(int

x)int

main()

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

if(head[i]) update(head[i],1

); m=read();

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

sort(q+1,q+m+1

);

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

ans[q[i].id]=getsum(q[i].y)-getsum(q[i].x-1

); }

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

printf(

"%d\n

",ans[i]);

return0;

}

洛谷P1972 SDOI2009 HH的項鍊

這道題想了很久,發題解是為了理解的更深刻一點。管理放我過好嘛qwq 步入正題 這道題應該是很多做法,我選擇的是離線 樹狀陣列。首先輸入陣列。用fisrt陣列先記錄元素最開始出現的位置,對應的每乙個樹狀陣列的位置add一下 樹狀陣列洛谷也有模板題的了解一下就ok啦 rep i,1 n 然後倒著更新一遍...

洛谷P1972 SDOI2009 HH的項鍊

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

洛谷 P1972 SDOI2009 HH的項鍊

1.按每個要求的區間的右端點排序一下 2.樹狀陣列tree j 維護從1到j區間內不同數字的個數有多少個 3.然後用字首和的思想就好 tree r tree l 1 1 include2 include3 include4 define maxn 1000002 5 define next nex ...