P2184 貪婪大陸 題解

2022-05-30 16:36:11 字數 1438 閱讀 6605

小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最後一道防線是...