9
线段树第一记,提交19次才AC!!!!!!
线段树可以用来解决动态区间内的最大值最小值问题;主要是树状数组能做到的,线段树都能做到;
三点:
1.怎样建线段树;
2.怎样查找区间内的最值,或者你想要的结果;
3.节点的更新和区间的更新;
代码:
#include#include #include using namespace std;int a[200005],b[800050],A,B;void build(int i,int l,int r){ if(l==r) b[i]=a[l]; else {build(2*i,l,(l+r)/2); build(2*i+1,(l+r)/2+1,r); b[i]=max(b[2*i],b[2*i+1]); } }int query(int k,int begin,int end){ int p1,p2; if(A>end||B =A&&end<=B) return b[k]; p1=query(2*k,begin,(begin+end)/2); p2=query(2*k+1,(begin+end)/2+1,end); return max(p1,p2); }void updata(int i,int l,int r){ if(l==r) b[i]=B; else {int mid=(l+r)/2; if(A<=mid) updata(2*i,l,(l+r)/2); else updata(2*i+1,(l+r)/2+1,r); b[i]=max(b[2*i],b[2*i+1]); }}int main(){ int n,m,i,j,k,s,t; char ch[10]; while(cin>>n>>m) { for(i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); while(m--) { scanf("%s%d%d",&ch,&A,&B); if(ch[0]=='U') updata(1,1,n); else { s=query(1,1,n); printf("%d\n",s); } } } return 0;}