小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 4
1 1 3
2 2 5
1 2 4
2 3 5
輸出
1
2
我們查的時候,我們只需要查1到當前區間結尾中包含了多少個開頭,然後我們查1到當前區間前乙個位置包含了多少個結尾,然後把這個做差,我們就可以知道有多少種地雷是出現在當前區間中,然後這道題就成功的被我們轉化成了乙個單點修改,區間查詢的簡單的問題。
用線段樹和樹狀陣列都可,看個人喜好,下面是比較簡單的樹狀陣列**\(\downarrow\)
#include#define ll long long
using namespace std;
template inline void read(t &x)
while (isdigit(ch))
x *= f;
return;
}template inline void write(t x)
if(x > 9)
write(x/10);
putchar(x % 10 + '0');
return;
}int head[500005], tail[500005], n, m;
inline int lowbit(int x)
inline void add_head(int x)
inline void add_tail(int x)
inline int sum_head(int x)
inline int sum_tail(int x)
int main()
else
cout << sum_head(y) - sum_tail(x-1) << endl;
}return 0;
}
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最後一道防線是...