二次元MLEセグメントツリー

約二次元ツリーライン、taが死にました

のは、二次元のプレイでツリーラインの2種類を見てみましょう

1.クワッド

 

 

 しかし死んTA、TAは$ \シータ(N)$、プラス定数のツリーライン、$ T $サシバエです

2.セグメントツリーカバーツリーライン

私は引き出すしようと...

 

 各ボックスには、グラフセグメント木であります

未完の限り(あなたが作ると見、著者は、ハーフストロークを持っています)

 

 図の拡大

 今、各ドットは、本当のポイントを表し

そして、今日のトピックに説明し、例えば(表面タイトルを保持します)

私は間隔を変更するためにお話しましょう

 

 $緑のドット割り当て$ 9想定(私はあなたが見つけることができると信じて、私たちは今、数字を与えて慎重に見て

 

一次元ツリーラインの練習の後、我々は6グリーンポイントを変更します

しかし、これは$ \シータ(NlogN)$である、それはT $を$ます

私たちは、この青い点で動作することができます

その後、我々はマップにのみ4緑の点を変更することができます

コード:

struct Tree
{
	struct tree { int tag; }t[maxn<<2]; void down(int k) { int tmp=t[k].tag; t[l(k)].tag=max(t[l(k)].tag,tmp); t[r(k)].tag=max(t[r(k)].tag,tmp); } void change(int k,int l,int r,int L,int R,int v) { if(L<=l&&r<=R){t[k].tag=v;return;} down(k);int mid=(l+r)>>1; if(L<=mid) change(l(k),l,mid,L,R,v); if(mid<R) change(r(k),mid+1,r,L,R,v); } }T[maxn<<2];
void change(int k,int l,int r,int L,int R,int ll,int rr,int v) { if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;} int mid=(l+r)>>1; if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v); if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v); }

次の問い合わせの単一ポイントであります

 

 私たちは、図2の緑色の点を確認する必要があります。

 黄色のボックス内の次の3つの図は、この緑色の点についての情報を持っているので、しかし、我々は、これだけのポイントがある照会することはできません。

 

 だから我々はそれにクエリテイク$最大/最小$の側を歩い

コード:

	int query(int k,int l,int r,int p) { if(l==r) return t[k].tag; down(k);int mid=(l+r)>>1; if(p<=mid) return query(l(k),l,mid,p); else return query(r(k),mid+1,r,p); }
int query(int k,int l,int r,int p1,int p2) { if(l==r){return T[k].query(1,1,maxn-1,p2);} int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1; if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2)); else return max(ans,query(r(k),mid+1,r,p1,p2)); }

同様に、完全なコードのように:

struct Tree
{
	struct tree { int tag; }t[maxn<<2]; void down(int k) { int tmp=t[k].tag; t[l(k)].tag=max(t[l(k)].tag,tmp); t[r(k)].tag=max(t[r(k)].tag,tmp); } void change(int k,int l,int r,int L,int R,int v) { if(L<=l&&r<=R){t[k].tag=v;return;} down(k);int mid=(l+r)>>1; if(L<=mid) change(l(k),l,mid,L,R,v); if(mid<R) change(r(k),mid+1,r,L,R,v); } int query(int k,int l,int r,int p) { if(l==r) return t[k].tag; down(k);int mid=(l+r)>>1; if(p<=mid) return query(l(k),l,mid,p); else return query(r(k),mid+1,r,p); } }T[maxn<<2]; void change(int k,int l,int r,int L,int R,int ll,int rr,int v) { if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;} int mid=(l+r)>>1; if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v); if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v); } int query(int k,int l,int r,int p1,int p2) { if(l==r){return T[k].query(1,1,maxn-1,p2);} int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1; if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2)); else return max(ans,query(r(k),mid+1,r,p1,p2)); }

(複数で利用可能な他の操作、基本的には空のために

おすすめ

転載: www.cnblogs.com/ooovooo/p/11779048.html