題目大意:給你n個點,m個操作。操作分兩種:1.種樹,在區間[ l , r ] 中種一種樹,保證每次種樹的種類都不一樣。2.查詢:查詢這個閉區間有多少種樹。
注釋:n<=50000 , m<=50000
想法:這題與以往的校門外的樹不同,這題顯然是道好題!!我們思考一下:如果我們正面思考,即,使用線段樹維護區間樹的種類。那麼,我們思考一下,兩個區間——[ l , r ] 和 [ l , r ],其中,小寫的表示被修改區間,我們要在大寫的區間裡種樹。那麼,什麼情況下小寫區間可能被修改呢?(l<=l&&l<=r) | | (l<=r&&r<=r) | | (l<=l&&r<=r)
| | (l<=l&&r<=r),共計四種情況,所以....去死吧!啊啊啊!咳咳,想別的方法。有一句叫正難則反,所以,我們考慮反面情況:考慮什麼的反面,如果是考慮修改,那恭喜你,你已經gg了,雖然這題的資料量支援你這麼做,但是這個**的實現難度還不在博主的能力範圍,所以,果斷拋棄了!我們想到考慮計算不滿足條件者。什麼意思呢?就是我們維護不在這段區間之內的種類,所以,我們只需思考兩種情況:(r<=l)||(l>=r)這個東西,我們對每個修改,按它的左端點維護字尾和,右端點維護字首和,想到使用樹狀陣列維護,即可。
最後,附上醜陋的**......
#include #include using namespace std;int n;
int tree1[50010];
int tree2[50010];
void fix1(int a)//修改字首和
}void fix2(int a)//修改字尾和
}int query1(int a)//查詢字首和
int query2(int a)//查詢字尾和
int main()
else
}return 0;
}
小結:錯誤
1.把a , b當成區間端點,過樣例,爆蛋
2.忘記區間開閉,過樣例,爆蛋
校門外的樹
描述 某校大門外長度為 l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0的位置,另一端在 l的位置 數軸上的每個整數點,即0,1,2 l,都種有一棵樹。馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...
校門外的樹
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...
校門外的樹
校門外的樹 題目描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知...