樹狀陣列 校門外的樹
時間限制: 1 sec 記憶體限制: 128 mb
題目描述
校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的……
如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作:
k=1,k=1,讀入l、r表示在區間[l,r]中種上一種樹,每次操作種的樹的種類都不同
k=2,讀入l,r表示詢問l~r之間能見到多少種樹
(l,r>0)
輸入 第一行n,m表示道路總長為n,共有m個操作
接下來m行為m個操作
輸出 第一行n,m表示道路總長為n,共有m個操作
接下來m行為m個操作
樣例輸入
5 4
1 1 3
2 2 5
1 2 4
2 3 5
樣例輸出 1 2
就是樹狀陣列嗎,直接水過。
這個題要用兩個樹狀樹組。但總的來說,它的思路是用字首和相減的方式,維護出答案。
它會動態地插入一些區間,在這個區間中,就多了一種樹。於是我們可以用兩個陣列 l[ ] 和 r[ ],來分別維護前 i 個點,有多少個區間左界,有多少個區間右界。詢問區間[a,b]時,只要寫出l[b]-r[a-1]就可以了。因為l[b]可以表示出在[1,b]有多少個區間開始,而r[a-1]又可以表示出在a之前有多少個區間結束,這樣一減就是答案。
#include
#include
#include
using
namespace
std;
int t1[50010],t2[50010];
int m,n,k,l,r;
int lowbit(int x)
void add_t1(int x,int y)
} void add_t2(int x,int y)
} int sum_t1(int x)
return ans;
} int sum_t2(int x)
return ans;
} int main()
}
校門外的樹 樹狀陣列
time limit 10000ms memory limit 65536k total submit 55 accepted 20 case time limit 1000ms description 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某...
校門外的樹(樹狀陣列)
description 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k 1,讀入l,r表示在l r之間種上的一種樹 k 2,讀入l,r表示詢問l r之間能見到多少種樹 l,r 0 ...
校門外的樹 (樹狀陣列)題解
校門外的樹 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k kk 1,讀入l ll,r rr表示在l ll r rr之間種上的一種樹 k kk 2,讀入l ll,r rr表示詢問l...