回檔 校門外的樹3 線段樹的應用

2022-09-03 23:39:14 字數 1473 閱讀 4516

描述

校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的……

如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作:

k=1,讀入l,r表示在l~r之間種上的一種樹

k=2,讀入l,r表示詢問l~r之間能見到多少種樹

(l,r>0)

輸入格式

第一行n,m表示道路總長為n,共有m個操作

接下來m行為m個操作

輸出格式

對於每個k=2輸出乙個答案

備註範圍:20%的資料保證,n,m<=100

60%的資料保證,n <=1000,m<=50000

100%的資料保證,n,m<=50000

注意:樹是可以重疊的,比如1號位置上可以種多種樹

解析:這題可以這麼做,建立兩棵線段樹,分別維護這個點之前有幾個左括號和這個點之後有幾個右括號,於是就可以做啦。

**:

#include#include

using

namespace

std;

struct

nodetr[

800001

];int

n,q;

int a[200001

];int

read()

returna;}

void build(int k,int x,int

y)

int mid=(x+y)>>1

; build(k

<<1

,x,mid);

build(k

<<1|1,mid+1

,y);

return;}

void insertl(int now,int x,int

y)

int mid=(l+r)>>1

;

if (x>mid) insertl(now<<1|1

,x,y);

else

if (y<=mid) insertl(now<<1

,x,y);

else

return;}

void insertr(int now,int x,int

y)

int mid=(l+r)>>1

;

if (x>mid) insertr(now<<1|1

,x,y);

else

if (y<=mid) insertr(now<<1

,x,y);

else

return;}

int findl(int k,int

x)int findr(int k,int

x)int

main()

else

if (now==2

)

}return0;

}

線段樹 校門外的樹

題目描述 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k 1,k 1,讀入l r表示在區間 l,r 中種上一種樹,每次操作種的樹的種類都不同 k 2,讀入l,r表示詢問l r之間能...

校門外的樹(3)

校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k 1,讀入l,r表示在l r之間種上的一種樹 k 2,讀入l,r表示詢問l r之間能見到多少種樹 l,r 0 這道題暴力線段樹無法維護...

校門外的樹

描述 某校大門外長度為 l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0的位置,另一端在 l的位置 數軸上的每個整數點,即0,1,2 l,都種有一棵樹。馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...