P2184 貪婪大陸

2022-05-03 13:24:20 字數 1591 閱讀 8595

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

/*

因為放炸彈的時候不是將前面放的炸彈覆蓋,而是累加,所以不是簡單的求最大值或者求和。然後我想到了用線段樹,在每乙個節點下開乙個陣列,記錄下面的炸彈種類,但是想想就會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最後一道防線是...