面對螞蟻們的瘋狂進攻,小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的每次詢問,輸出乙個答案(單獨一行),表示當前區間地雷總數。
輸入樣例#1: 複製
5 41 1 3
2 2 5
1 2 4
2 3 5
輸出樣例#1: 複製
12
/*因為放炸彈的時候不是將前面放的炸彈覆蓋,而是累加,所以不是簡單的求最大值或者求和。然後我想到了用線段樹,在每乙個節點下開乙個陣列,記錄下面的炸彈種類,但是想想就會tle或者re,所以果斷放棄,寫樹狀陣列(其實是從乙個學長那兒看的)。
(類似字首和)因為炸彈一放就是乙個區間,所以我們可以記錄放炸彈的區間的起點l和終點r,表示[l..r]放了一種炸彈。那麼我們可以知道乙個區間內的炸彈的種類的總數等於[1..r]的炸彈種類的和-[1..l-1]的右端點數。至於為什麼是右端點,是因為查詢區間可能有當前這種炸彈,如果減去的是左端點,那麼就會多減了一種,使答案變小。
所以炸彈種類數=l[1..r](1..r的炸彈種類)-r[1..l-1](1..r的右端點個數)
*/#include
#include
#include
#include
#include
#define n 1000050
using
namespace
std;
int n,m,q,l,r,sum,tree[n][2]; //
tree[i][0]表示以i為左端點的炸彈的個數,tree[i][1]表示以i為右端點的炸彈的個數
int read() //
一開始讀入優化寫錯過了樣例全部re
return sum*f;
}int lowbit(int x) //
找最後乙個1的位置
void update(int x,intp)}
int query(int x,int
p)
return
sum;
}int
main()
return0;
}
P2184 貪婪大陸
題目描述面對螞蟻們的瘋狂進攻,小ff的tower defence宣告失敗 人類被螞蟻們逼到了greed island上的乙個海灣。現在,小ff的後方是一望無際的大海,前方是變異了的超級螞蟻。小ff還有大好前程,他可不想命喪於此,於是他派遣手下最後一批改造scv布置地雷以阻擋螞蟻們的進攻。小ff最後一...
P2184 貪婪大陸
看到全是線段樹或者樹狀陣列寫法,就來提供一發全網唯一cdq分治三維偏序解法吧 容易發現,這個題的查詢就是對於每個區間l,r,查詢有多少個修改區間li,ri與l,r有交集 轉化為數學語言,就是查詢滿足li r且ri l的修改個數 乙個二維偏序問題,但是我們發現,這是個動態插入的二維偏序問題 一時不知所...
P2184 貪婪大陸
面對螞蟻們的瘋狂進攻,小ff的tower defence宣告失敗 人類被螞蟻們逼到了greed island上的乙個海灣。現在,小ff的後方是一望無際的大海,前方是變異了的超級螞蟻。小ff還有大好前程,他可不想命喪於此,於是他派遣手下最後一批改造scv布置地雷以阻擋螞蟻們的進攻。小ff最後一道防線是...