hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一
段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此他的項鍊變得越來越長。有一天,他突然提出了一
個問題:某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。。。因為項鍊實在是太長了。於是,他只
好求助睿智的你,來解決這個問題。
input
第一行:乙個整數n,表示項鍊的長度。
第二行:n個整數,表示依次表示項鍊中貝殼的編號(編號為0到1000000之間的整數)。
第三行:乙個整數m,表示hh詢問的個數。
接下來m行:每行兩個整數,l和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。
n ≤ 50000,m ≤ 200000。
output
m行,每行乙個整數,依次表示詢問對應的答案。
sample input
61 2 3 4 3 5
31 2
3 52 6
sample output
224
hint
題意:有一串項鍊,每點有個顏色,給你個區間。查詢這個區間內有幾種不同的顏色?
思路:預處理出上乙個與i顏色相同的點pre[i],將詢問按右端點排序,然後一邊往樹狀陣列進入點一邊處理詢,注意其中一些小技巧。
**:
#include #include #include #include using namespace std;
int n,m,sum;
const int maxn=1000010;
int pre[maxn],s[maxn],p[maxn],head[maxn],ans[maxn];
struct q
q[maxn];
bool cmp(q a,q b)
return res;
}int main()
scanf("%d",&m);
for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+m+1,cmp);
for(i=j=1;i<=m;i++)
for(i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
多看 多學 多想
HH的項鍊 樹狀陣列
code 我洛谷部落格 點這裡某一段貝殼中,包含了多少種不同的貝殼?最開始看見這道題時,沒有思路 但再看看,可以非常明了的發現這是乙個樹狀陣列ban題 設有一長為5的項鍊 1 2 3 2 1 然後 m 3 1 52 5 1 3我的思路是這樣,由於要求的是種類數 求l 到 r 的個數 每種貝殼只能存乙...
HH的項鍊(樹狀陣列)
由於詢問的是區間中貝殼的種類數,所以問詢區間中相同種類的貝殼只有乙個會起作用 將i位置的貝殼前一次出現的位置記作pre i 種類為x的貝殼最後一次出現的位置記作f x 類似於鄰接表的nxt和had,利用pre i f x f x i來處理pre 對於每個詢問 l,r 只有pre i 也就是說所處位置...
HH的項鍊 樹狀陣列
我csdn部落格 點這裡某一段貝殼中,包含了多少種不同的貝殼?最開始看見這道題時,沒有思路 但再看看,可以非常明了的發現這是乙個樹狀陣列ban題 設有一長為5的項鍊 1 2 3 2 1 然後 m 3 1 52 5 1 3我的思路是這樣,由於要求的是種類數 求l 到 r 的個數 每種貝殼只能存乙個 不...