貪婪大陸 (樹狀陣列)

2022-08-12 22:18:16 字數 1348 閱讀 6645

面對螞蟻們的瘋狂進攻,小 ff 的 tower defence 宣告失敗……人類被螞蟻們逼到了greed island 上的乙個海灣。現在,小 ff 的後方是一望無際的大海, 前方是變異了的超級螞蟻。 小 ff 還有大好前程,他可不想命喪於此, 於是他派遣手下最後一批改造 scv布置地雷以阻擋螞蟻們的進攻。

小 ff 最後一道防線是一條長度為 n 的戰壕, 小 ff 擁有無數多種地雷,而 scv 每次可以在[ l , r ]區間埋放同一種不同於之前已經埋放的地雷。 由於情況已經十萬火急,小ff 在某些時候可能會詢問你在[ l』 , r』] 區間內有多少種不同的地雷, 他希望你能盡快的給予答覆。

輸入第一行為兩個整數 n 和 m; n 表示防線長度, m 表示 scv 布雷次數及小 ff 詢問 的次數總和。

接下來有 m 行, 每行三個整數 q,l , r;

若 q=1 則表示 scv 在[ l , r ]這段區間 布上一種地雷,

若 q=2 則表示小 ff 詢問當前[ l , r ]區間總共有多少種地雷。

輸出對於小 ff 的每次詢問,輸出乙個答案(單獨一行),表示當前區間地雷總數

樣例輸入

5 41 1 3

2 2 5

1 2 4

2 3 5

樣例輸出12

提示【資料範圍】

對於 30%的資料: 0<=n, m<=1000;

對於 100%的資料: 0<=n, m<=10^5.

本來以為是維護區間加1區間最值查詢,但果然錯了

要維護的是區間種類查詢

可以這樣做

把左區間和右區間分別當作左括號和右括號,那麼每乙個左括號就是乙個區間的開始,每乙個右括號就是乙個區間的結束

那麼對於每乙個查詢的區間[l,

r][l

,r],那麼區間中地雷的個數就是1—r中左括號的個數(也就是前面埋了有多少種地雷)減去1–(l-1)中右括號的個數(也就是前面埋完了多少種地雷)

那我們只需要兩個樹狀陣列來分別維護左括號和右括號就是了

**

#includeusing namespace std;

inline int read()

int t1[100005],t2[100005],n,m;

inline int lowbit(int k)

inline int add(int l,int r)

while(r<=n) }

inline int query(int l,int r)

while(l>0)

return ans1-ans2;

}int main()

return 0;

}

樹狀陣列 貪婪大陸

人類被螞蟻們逼到了 greed island 上的乙個海灣。現在,小 ff 的後方是一望無際的大海,前方是變異了的超 級螞蟻。小 ff 還有大好前程,他可不想命喪於此,於是他派遣手下最後一批改造 scv 布置地雷以阻擋螞蟻們的進攻。小 ff 最後一道防線是一條長度為 n 的戰壕,小 ff 擁有無數多...

luogu2184 貪婪大陸(樹狀陣列)

我是超連結 這道題看著好眼熟啊 看上去很複雜,實際上就是樹狀陣列的基本操作 單點修改區間查詢 單點新增值,查詢時兩個區間相減就ok,但這個題是1為左區間,所以不用減 原因?答案實際上就是 1,r 的左端點數 1,l 1 的右端點數 include using namespace std int n,...

luogu 2184 貪婪大陸 樹狀陣列

面對螞蟻們的瘋狂進攻,小ff的tower defence宣告失敗 人類被螞蟻們逼到了greed island上的乙個海灣。現在,小ff的後方是一望無際的大海,前方是變異了的超級螞蟻。小ff還有大好前程,他可不想命喪於此,於是他派遣手下最後一批改造scv布置地雷以阻擋螞蟻們的進攻。小ff最後一道防線是...