http://acm.hdu.edu.cn/showproblem.php?pid=3308
自己把每一步都考虑清楚了,草稿纸写了一大面,无奈代码还是没码出来,参考了下别人的,,,过了三天,自己再写了一遍,这是一道线段树区间合并的题目。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 111111 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int n,m; struct tree { int lv,rv; int lsum,rsum,msum; }sum[maxn<<2]; void pushup(int rt,int l,int r) { int m = (l+r)>>1; sum[rt].msum = max( sum[rt<<1].msum,sum[rt<<1|1].msum ); if( sum[rt<<1].rv < sum[rt<<1|1].lv ){ sum[rt].msum = max ( sum[rt].msum,sum[rt<<1].rsum+sum[rt<<1|1].lsum ); } sum[rt].lv = sum[rt<<1].lv; sum[rt].rv = sum[rt<<1|1].rv; sum[rt].lsum = sum[rt<<1].lsum; sum[rt].rsum = sum[rt<<1|1].rsum; if(sum[rt<<1].lsum == m-l+1 && sum[rt<<1].rv < sum[rt<<1|1].lv ){ sum[rt].lsum = sum[rt<<1].lsum + sum[rt<<1|1].lsum; } if(sum[rt<<1|1].rsum == r-m && sum[rt<<1].rv < sum[rt<<1|1].lv ){ sum[rt].rsum = sum[rt<<1|1].rsum + sum[rt<<1].rsum; } } void build(int l,int r,int rt) { if(l == r){ scanf("%d",&sum[rt].lv); sum[rt].rv = sum[rt].lv; sum[rt].lsum = sum[rt].rsum = sum[rt].msum = 1; return ; } int m = (l + r)>>1; build(lson); build(rson); pushup(rt,l,r); } void update(int a,int b,int l,int r,int rt) { if(a==l && l==r){ sum[rt].lv = sum[rt].rv = b; sum[rt].lsum = sum[rt].rsum = sum[rt].msum = 1; return ; } int m = (l + r)>>1; if(a <= m) update(a,b,lson); if(a > m) update(a,b,rson); pushup(rt,l,r); } int query(int left,int right,int l,int r,int rt) { if(left==l && right==r){ return sum[rt].msum; } int m = (l + r) >> 1; if(right<=m) return query(left,right,lson); else if(left>m) return query(left,right,rson); else { int a = query(left,m,lson); int b = query(m+1,right,rson); if(sum[rt<<1].rv < sum[rt<<1|1].lv){ int lsum = min( sum[rt<<1].rsum, m - left +1); int rsum = min( sum[rt<<1|1].lsum,right - m ); return max( a,max(lsum + rsum,b) ); } else return max( a,b ); } } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); build(1,n,1); char ch[2]; for(int i=1;i<=m;i++){ scanf("%s",ch); if(ch[0]=='Q'){ int x,y; scanf("%d%d",&x,&y);x++,y++; printf("%d\n",query(x,y,1,n,1)); } else if(ch[0]=='U'){ int a,b; scanf("%d%d",&a,&b);a++; update(a,b,1,n,1); } } } return 0; }