luogu 2184 貪婪大陸 樹狀陣列

2021-08-24 20:35:32 字數 1246 閱讀 4239

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

題目分析:對左端點和右端點分別單點更新,容易看出,答案就是查詢區間右端點左邊的左端點個數 - 查詢區間左端點左邊的右端點個數

#include #include #include using namespace std;

int const max = 1e5 + 5;

int n, m;

int lsum[max], rsum[max];

int lowbit(int x)

void updatel(int pos, int val)

}void updater(int pos, int val)

}int getlsum(int pos)

return ans;

}int getrsum(int pos)

return ans;

}int main() else

}}

luogu2184 貪婪大陸(樹狀陣列)

我是超連結 這道題看著好眼熟啊 看上去很複雜,實際上就是樹狀陣列的基本操作 單點修改區間查詢 單點新增值,查詢時兩個區間相減就ok,但這個題是1為左區間,所以不用減 原因?答案實際上就是 1,r 的左端點數 1,l 1 的右端點數 include using namespace std int n,...

luogu 2184 貪婪大陸

題解 線段樹或者樹狀陣列都可以。對於詢問l r之間有多少地雷,可以理解為首部在r之前的線段段數減去尾部在 r 1 之前的線段段數,所以對於埋地雷的操作l r,可以理解為在兩個線段樹上的某個位置加一,詢問相當於是求每個線段樹的前若干個位置的總和是多少,然後兩個線段樹求出來的答案再進行相減操作就是答案,...

學術篇 luogu2184貪婪大陸

題目在這裡哦,戳一下就可以了 題目大意 支援兩種操作,區間新增一種新元素,查詢區間顏色種數.題目標籤是線段樹啊,我也本來想寫乙個線段樹,後來寫不出來 我太弱了orz 然後就草率地看了看題解裡面的思路咯,感覺思路非常的不錯,於是我就a掉這題之後寫了這篇blog 我們通過這幅圖可以看到 我們直接統計區間...