校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的……這道題暴力線段樹無法維護,因為每個時刻只有一種樹,所以想到直接管樹的種類即可。其實對於乙個區間查詢(x, y),它的值就是樹的總種類減去(1,x-1)的樹的種類再減去(y+1,n)的樹的種類。兩顆線段樹暴力維護即可。如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作:
k=1,讀入l,r表示在l~r之間種上的一種樹
k=2,讀入l,r表示詢問l~r之間能見到多少種樹
(l,r>0)
1 #include 2using
namespace
std;
3#define debug45
#ifdef debug
6const
int maxn=55, maxm=55;7
#else
8const
int maxn=50005, maxm=50005;9
#endif
1011
intn, m, flag;
12int segl[maxn*4], segr[maxn*4
];13
int makl[maxn*4], makr[maxn*4
];14
15void swap(int &x, int &y)
2021
void pushdown(int
x)29
30void add(int pos, int l, int r, int l, int
r)38
pushdown(pos);
39int mid=(l+r)>>1
;40 add(pos<<1
, l, mid, l, r);
41 add(pos<<1|1, mid+1
, r, l, r);
42if (flag==1) segl[pos]=segl[pos<<1]+segl[pos<<1|1
];43
else segr[pos]=segr[pos<<1]+segr[pos<<1|1
];44}45
46int query(int pos, int l, int r, int
pos)
5455
intmain()
68else75}
76return0;
77 }
校門外的樹
描述 某校大門外長度為 l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0的位置,另一端在 l的位置 數軸上的每個整數點,即0,1,2 l,都種有一棵樹。馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...
校門外的樹
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...
校門外的樹
校門外的樹 題目描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知...