題目描述
面對螞蟻們的瘋狂進攻,小ff的tower defence宣告失敗……人類被螞蟻們逼到了greed island上的乙個海灣。現在,小ff的後方是一望無際的大海, 前方是變異了的超級螞蟻。 小ff還有大好前程,他可不想命喪於此, 於是他派遣手下最後一批改造scv布置地雷以阻擋螞蟻們的進攻。輸入格式小ff最後一道防線是一條長度為n的戰壕, 小ff擁有無數多種地雷,而scv每次可以在[ l , r ]區間埋放同一種不同於之前已經埋放的地雷。 由於情況已經十萬火急,小ff在某些時候可能會詢問你在[ l』 , r』] 區間內有多少種不同的地雷, 他希望你能盡快的給予答覆。
對於30%的資料: 0<=n, m<=1000;
對於100%的資料: 0<=n, m<=10^5.
第一行為兩個整數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
這道題我們可以用兩個樹狀陣列來維護所有區間的左端點和右端點的位置。
兩個操作:
插入操作即把區間的左右端點分別插入兩個樹狀陣列中即可。
查詢操作給了我們區間[l,r]找出該區間中的地雷種數。我們只需要找出左端點在r左邊的所有數 和 右端點在l的左邊的所有數
,然後相減即可得到答案。
**如下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define pii pair
using
namespace std;
const
int n=
1e5+5;
int n,m;
int trl[n]
,trr[n]
;//trl維護所有左端點的位置,trr維護所有右端點的位置
intlowbit
(int x)
//三個樹狀陣列的模板函式
void
add(
int tr,
int x,
int c)
intsum
(int tr,
int x)
intmain()
//查詢即為 左端點在r左邊的所有數-右端點在l的左邊的所有數
else
printf
("%d\n"
,sum
(trl,r)
-sum
(trr,l-1)
);}return0;
}
P2184 貪婪大陸
看到全是線段樹或者樹狀陣列寫法,就來提供一發全網唯一cdq分治三維偏序解法吧 容易發現,這個題的查詢就是對於每個區間l,r,查詢有多少個修改區間li,ri與l,r有交集 轉化為數學語言,就是查詢滿足li r且ri l的修改個數 乙個二維偏序問題,但是我們發現,這是個動態插入的二維偏序問題 一時不知所...
P2184 貪婪大陸
面對螞蟻們的瘋狂進攻,小ff的tower defence宣告失敗 人類被螞蟻們逼到了greed island上的乙個海灣。現在,小ff的後方是一望無際的大海,前方是變異了的超級螞蟻。小ff還有大好前程,他可不想命喪於此,於是他派遣手下最後一批改造scv布置地雷以阻擋螞蟻們的進攻。小ff最後一道防線是...
P2184 貪婪大陸
目錄p2184 貪婪大陸 樹狀陣列的模板題 1.只要乙個區間的開頭在乙個節點 i 的左邊,那麼這個區間包含在區間 1 i 中。2.只要乙個區間的尾部在乙個節點 j 的左邊,那麼這個區間肯定不屬於 j 之後的所有區間 所以我們可以搞兩個樹狀陣列來做 tree i 維護 i 之前的開頭數量 tree j...