離線樹狀陣列 洛谷P1972

2021-09-01 00:10:03 字數 1255 閱讀 1734

傳送門:

離線的題目,並且是求區間問題。我們就離線樹狀陣列吧。

線段樹也是可以的,這題莫隊70分,分塊是和莫隊一樣的,就沒寫,估計也就70分。

我們來分析一下這個題目吧。

詢問一段區間的種類數,並且沒有更新操作。我們就分析一下怎麼離線。

(五分鐘後)

好了,經過分析可知,我們按詢問區間的右端點排序,這樣,所有詢問,我們可以for一遍處理出該區間的資訊。

(因為對於所有詢問,每乙個詢問都是從左往右的嘛)。然後在每乙個詢問區間裡面,我們都保留盡量靠右的數字,因為左邊出現過的在右邊也出現了,我們就把左邊出現的直接捨掉就可以了。

然後我們保留一下這個詢問區間的答案就完事了。

#include using namespace std;

const int maxn = 1e6+7;

int sump[maxn],psum[maxn];

int a[maxn];

int vis[maxn];

int ans[maxn];

int n;

struct node

q[maxn];

bool cmp(node a,node b)

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

sort(q+1,q+1+k,cmp);

int l = 1;

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

else

}l = q[i].r+1;

ans[q[i].id] = query_range(q[i].l,q[i].r);

} for(int i=1;i<=k;i++)

}return 0;

}

下面是70分的莫隊

#include using namespace std;

const int maxn = 1e6+7;

int cnt[maxn];

int a[maxn];

int pos[maxn];

int ans[maxn];

int ans = 0;

struct node

q[maxn];

bool cmp(node a,node b)

while(q[i].rr)

ans[q[i].id] = ans;

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

return 0;

}

洛谷P1972(莫隊演算法)

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

洛谷P1972 HH的項鍊 樹狀陣列

題目 題意 給定乙個長度為n的序列,數字表示珠子的種類。m次查詢每次詢問給定區間內珠子的種類數。思路 可以說是運用了字首和的思想吧。從前到後的去處理查詢,而對於某乙個查詢區間,如果某乙個種類出現了多次的話我們只需要計算最後一次出現。用query x 表示1 x區間內的種類數,其中對每個種類我們只標記...

樹狀陣列 洛谷 P1972 HH的項鍊

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