hdu 6183 線段樹的空間優化

2021-08-07 21:26:17 字數 851 閱讀 5670

題意:

乙個空的座標系,有④種操作:①1 x y c表示在(x, y)點染上顏色c;②2 x y1 y2表示查詢在(1, y1)到(x, y2)範圍內有多少種不同的顏色:

③0表示清屏;④3表示程式退出(0<=x, y<=1000000, 0<=c<=50)

思路:開五十個線段樹(一種顏色乙個),以y為下表,儲存min x,(因為查詢x固定1---x)然後暴力查詢50個就好了

但是顯然碰到了乙個問題,1e6 開50個線段樹顯然不現實。。所以需要空間優化一下。。。這裡我們考慮動態來開闢線段樹,有效的節點進行分配,無效則不分配。。。提問,這樣空間為什麼是合理的呢?其實因為乙個add 最多開logn個節點,單組只有1.5e5次查詢,顯然,最多也就只開了qlogn個。那麼這樣空間複雜度就是合理的了。。具體動態開闢的實現也非常簡單,模擬trie,見**。

**:#includeusing namespace std;

#define mem(x,y) memset(x,y,sizeof(x));

const int maxn=3e6+10;

int root[55];

int l[maxn],r[maxn],tot,sum[maxn];

void update(int &rt,int idx,int val,int l,int r)

int query(int rt,int l,int r,int ll,int rr)

int main(){

int t,n,op,x,y,y1,y2,c,ret;

while(scanf("%d",&op)){

if(op==0){

mem(l,-1);mem(r,-1);

for(int i=0;i

hdu6183 線段樹動態開點

在寫題的時候偶然發現的 都是大佬 大概就是 將線段樹接下來的 i 1 和 i 1 1改為了用乙個陣列l i 和r i 來儲存感覺很有意思 有一點點像鏈式前向星 題目位址 hdu6183 還乙個大佬寫的 cdq 線段樹 include define mod 998244353 using namesp...

hdu 4391 線段樹 優化

2012 多校第十場,這個題目比賽的時候我直接在每個節點裡面開了乙個map,結果毫無疑問mle 了,比賽之後看了結題報告說是 分段雜湊,沒學過,後來聽說線段樹稍微剪枝一下就能過,換了一下思路,確實就能過了,每個節點也不需要記錄每種顏色的個數了,只需要記錄最大的編號和最小的就可以了。include i...

hdu 4262 線段樹優化

include include include includeusing namespace std define lson u 1 define rson u 1 1 define maxn 100005 int map maxn struct nodet maxn 2 void pushup i...