P2184 貪婪大陸

2022-05-03 15:24:20 字數 1445 閱讀 2278

面對螞蟻們的瘋狂進攻,小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 4

1 1 3

2 2 5

1 2 4

2 3 5

輸出樣例#1:

1

2

題解:

看到這個題目的時候有了一種錯誤的思路,以為是個簡單的區間求和,可是仔細研究後發現並不是這樣的。並不是將區間內的最大值或者和輸出,因為有的時候可能兩個相鄰的區間放入物品,會預設為乙個了,這樣就出現了錯誤。於是就開始尋找思路(感謝web)。

我們可以將每個區間的左右端點插入到不同的樹中,乙個區間內物品的個數,其實就是1~r中左端點的個數減去1~(l-1)中右端點的個數,整理得出:ans=tot-(l[r..n]+r[1..l-1])      

即**中的 tot-(query1(n)-query1(y)+query2(x-1)),輸出即可

樹狀陣列版ac**:

#includeusing

namespace

std;

const

int n=1e5+10

;int n,m,tot,tr[n][2

];inline

int lowbit(int

x)inline

void updata1(int p,int

v)inline

int query1(int

p)inline

void updata2(int p,int

v)inline

int query2(int

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