UVA 11297 Census 二維線段樹

2022-05-20 08:52:06 字數 2205 閱讀 2553

求矩形區域最大最小值,單點修改。

建立x方向的線段樹,x方向線段樹的每個節點都是乙個y方向的線段樹。查詢複雜度log(n)*log(m),單點修改複雜度log(n)*log(m)。修改時對於x的葉節點和非葉節點需要區別對待。

#includeusing

namespace

std;

const

int n=510

;struct

segmenttree2d

max[ox][o]=max(max[2*ox][o],max[2*ox+1

][o]);

min[ox][o]=min(min[2*ox][o],min[2*ox+1

][o]);

return

; }

int mid=(ly+ry)>>1,lc=2*o,rc=2*o+1

;

if(y<=mid)updatey(lc,ly,mid);

else updatey(rc,mid+1

,ry);

max[ox][o]=max(max[ox][lc],max[ox][rc]);

min[ox][o]=min(min[ox][lc],min[ox][rc]);

}void updatex(int o,int lx,int

rx)

int mid=(lx+rx)>>1,lc=2*o,rc=2*o+1

;

if(x<=mid)updatex(lc,lx,mid);

else updatex(rc,mid+1

,rx);

ox=o;xleaf=false

; updatey(

1,1,m);//

非葉節點更新

}

void update(int posx,int posy,int

val)

void queryy(int o,int y1,int y2,int ly,int

ry)

int mid=(ly+ry)>>1,lc=2*o,rc=2*o+1

;

if(y1<=mid)queryy(lc,y1,y2,ly,mid);

if(y2>mid)queryy(rc,y1,y2,mid+1

,ry);

}void queryx(int o,int x1,int x2,int lx,int

rx)

int mid=(lx+rx)>>1,lc=2*o,rc=2*o+1

;

if(x1<=mid)queryx(lc,x1,x2,lx,mid);

if(x2>mid)queryx(rc,x1,x2,mid+1

,rx);

}void query(int xa,int xb,int ya,int

yb)

void buildy(int o,int ly,int

ry) max[ox][o]=max(max[2*ox][o],max[2*ox+1

][o]);

min[ox][o]=min(min[2*ox][o],min[2*ox+1

][o]);

return

; }

int mid=(ly+ry)>>1,lc=2*o,rc=2*o+1

; buildy(lc,ly,mid);buildy(rc,mid+1

,ry);

max[ox][o]=max(max[ox][lc],max[ox][rc]);

min[ox][o]=min(min[ox][lc],min[ox][rc]);

}void buildx(int o,int lx,int

rx)

int mid=(lx+rx)>>1,lc=2*o,rc=2*o+1

; buildx(lc,lx,mid);buildx(rc,mid+1

,rx);

ox=o;xleaf=false

; buildy(

1,1,m);

}};segmenttree2d t;

intmain()

else

}return0;

}

view code

uva 714 貪心 二分

include using namespace std const int maxm 500 int k,m,p maxm bool solve int ans else pre p i return kr k void print int ans else pre p i for int i 0 ...

UVA 10125 Sumsets(二分查詢)

given s,a set of integers,find the largest d such that a b c d where a,b,c,and d are distinct elements of s.several s,each consisting of a line contai...

uva 1421 箭術 二分

題目大意 有n個平行與x軸的線段,每條線段代表乙個靶子。你的任務是判斷是否可以站在x軸上 0,w 區間的某個位置射箭,使得箭能穿過所有靶子。解題思路 1 二分人站的位置,對於每個位置,維護靶子的可以擊中的角度,l,r 是現在箭可以到達的角度區間,l,r 是後面靶子的角度區間。2 有乙個函式是atan...