hh 有一串由各種漂亮的貝殼組成的項鍊。hh 相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh 不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題:某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答……因為項鍊實在是太長了。於是,他只好求助睿智的你,來解決這個問題。
輸入格式:
第一行:乙個整數n,表示項鍊的長度。
第二行:n 個整數,表示依次表示項鍊中貝殼的編號(編號為0 到1000000 之間的整數)。
第三行:乙個整數m,表示hh 詢問的個數。
接下來m 行:每行兩個整數,l 和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。
輸出格式:
m 行,每行乙個整數,依次表示詢問對應的答案。
輸入樣例#1:
61 2 3 4 3 5
31 2
3 52 6
輸出樣例#1:
224
資料範圍:
對於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 ...