二維線段樹 HDU 1823

2021-06-03 22:14:36 字數 1244 閱讀 4028

很裸的一道二維線段樹,第一次做,其實二維的線段樹也就是樹套樹,先一維再第二維,第

一、二維的操作都很類似。

說回hdu這道題,有點水,提交的時候記得交c++,g++會wa死你!

#define n 210

struct node;

struct node1t[n*4];

void build_sub(int id,int rt,int ll,int rr)

int mid = (ll+rr)>>1;

build_sub(id,rt<<1,ll,mid);

build_sub(id,rt<<1|1,mid+1,rr);

}void build(int id,int l,int r,int ll,int rr)

void add_sub(int id,int rt,int act,double love)

void add(int id,int h,int act,double love)

int mid = (t[id].hl+t[id].hr)>>1;

if(h<=mid)add(id<<1,h,act,love);

else add(id<<1|1,h,act,love);

}double sear(int id,int rt,int ll,int rr)

int mid = (t[id].subt[rt].al+t[id].subt[rt].ar)>>1;

if(rr<=mid)return sear(id,rt<<1,ll,rr);

else if(ll>mid)return sear(id,rt<<1|1,ll,rr);

else return max(sear(id,rt<<1,ll,mid), sear(id,rt<<1|1,mid+1,rr));

}double query(int id,int l,int r,int ll,int rr)

int mid = (t[id].hl+t[id].hr)>>1;

if(r<=mid)return query(id<<1,l,r,ll,rr);

else if(l>mid)return query(id<<1|1,l,r,ll,rr);

else return max(query(id<<1,l,mid,ll,rr), query(id<<1|1,mid+1,r,ll,rr));

}int main() else }}

return 0;

}

hdu 1823 線段樹(非二維做法)

都說這題是二維線段樹裸題,不過我二維線段樹有點麻煩 也不太想寫 還是得學的 我就直接開200棵線段樹了 這種方法在某一維很小的時候 是完全適用的 複雜度最多 100 1000 log 1000 完全不虛 include include includeusing namespace std const...

hdu1823(二維線段樹模板題)

單點更新,求二維區間最值。二維線段樹模板題。二維線段樹實際上就是樹套樹,即每個結點都要再建一顆線段樹,維護對應的資訊。一般一維線段樹是切割某一可變區間直到滿足所要查詢區間,求最值 求和等,二維就是先切割第一維的區間,再去切割第二維的區間。includeusing namespace std defi...

HDU 4819 二維線段樹

13年長春現場賽的g題,赤裸裸的二維線段樹,單點更新,區間查詢 不過我是第一次寫二維的,一開始寫t了,原因是我沒有好好利用行段,說白一點,還是相當於枚舉行,然後對列進行線段樹,那要你寫二維線段樹幹嘛 二維就是在每個行段也建一棵樹,來代表這個區間的行裡的某些列的值 其他操作倒是不難,因為有一維的功底,...