求矩形區域最大最小值,單點修改。
建立x方向的線段樹,x方向線段樹的每個節點都是乙個y方向的線段樹。查詢複雜度log(n)*log(m),單點修改複雜度log(n)*log(m)。修改時對於x的葉節點和非葉節點需要區別對待。
#includeusingview codenamespace
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;
}
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...