樹狀陣列 校門外的樹

2021-08-26 05:54:37 字數 1111 閱讀 6725

樹狀陣列 校門外的樹

時間限制: 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...