面對螞蟻們的瘋狂進攻,小 ff 的 tower defence 宣告失敗……人類被螞蟻們逼到了greed island 上的乙個海灣。現在,小 ff 的後方是一望無際的大海, 前方是變異了的超級螞蟻。 小 ff 還有大好前程,他可不想命喪於此, 於是他派遣手下最後一批改造 scv布置地雷以阻擋螞蟻們的進攻。本來以為是維護區間加1區間最值查詢,但果然錯了小 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.
要維護的是區間種類查詢
可以這樣做
把左區間和右區間分別當作左括號和右括號,那麼每乙個左括號就是乙個區間的開始,每乙個右括號就是乙個區間的結束
那麼對於每乙個查詢的區間[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最後一道防線是...