题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308
1 10 10 7 7 3 3 5 9 9 8 1 8 Q 6 6 U 3 4 Q 0 1 Q 0 5 Q 4 7 Q 3 5 Q 0 2 Q 4 6 U 6 10 Q 0 9
1 1 4 2 3 1 2 5
#include <iostream> #include <cstdio> using namespace std; struct node { int l,r; int mmax; int lmax,rmax; int lnum,rnum; }s[100000*4+10]; void InitTree(int l,int r,int k) { s[k].l=l; s[k].r=r; s[k].mmax=1; s[k].rmax=1; s[k].lmax=1; s[k].lnum=s[k].rnum=0; if (l==r) return ; int mid=(l+r)/2; InitTree(l,mid,2*k); InitTree(mid+1,r,2*k+1); } void UpdataTree(int i,int change,int k) { if (s[k].l==s[k].r&&s[k].l==i) { s[k].lnum=s[k].rnum=change; return ; } int mid=(s[k].l+s[k].r)/2; if (i>mid) UpdataTree(i,change,2*k+1); else if (i<=mid) UpdataTree(i,change,2*k); s[k].lnum=s[k*2].lnum; s[k].rnum=s[k*2+1].rnum; s[k].lmax=s[k*2].lmax; s[k].rmax=s[k*2+1].rmax; s[k].mmax=max(s[k*2].mmax,s[k*2+1].mmax); if(s[k*2].rnum<s[k*2+1].lnum) { s[k].mmax=max(s[k].mmax,s[k*2].rmax+s[k*2+1].lmax); if(s[k*2].lmax==s[k*2].r-s[k*2].l+1) s[k].lmax=s[k*2].lmax+s[k*2+1].lmax; if(s[k*2+1].rmax==s[k*2+1].r-s[k*2+1].l+1) s[k].rmax=s[k*2].rmax+s[k*2+1].rmax; } } int SearchTree(int l,int r,int k) { if (s[k].l==l&&s[k].r==r) return s[k].mmax; else { int mid=(s[k].l+s[k].r)/2; if (l>mid) return SearchTree(l,r,2*k+1); else if (r<=mid) return SearchTree(l,r,2*k); /*else { if (s[k].lnum<s[k].rnum) return SearchTree(l,mid,2*k)+SearchTree(mid+1,r,2*k+1); else if }*/ else { int a=min(s[k*2].rmax,mid-l+1); int b=min(s[k*2+1].lmax,r-mid); int Max=max(a,b); Max=max(Max,SearchTree(l,mid,2*k)); Max=max(Max,SearchTree(mid+1,r,2*k+1)); if(s[k*2].rnum<s[2*k+1].lnum) { Max=max(Max,a+b); } return Max; } } } int main() { int t; char ch[70]; scanf("%d",&t); while (t--) { int n,m,w,a,b; scanf("%d%d",&n,&m); InitTree(0,n-1,1); for (int i=0; i<n; i++) { scanf("%d",&w); UpdataTree(i,w,1); } for (int i=0; i<m; i++) { //getchar(); scanf("%s%d%d",ch,&a,&b); if (ch[0]=='Q') { //cout<<"!!!!!!!!!!!!!!!!!"<<endl; int ans=SearchTree(a,b,1); printf ("%d\n",ans); } else if (ch[0]=='U') { UpdataTree(a,b,1); } } } return 0; }