ACdream 1101 瑶瑶想要玩滑梯

来源:互联网 发布:js对象概念 编辑:程序博客网 时间:2024/04/29 22:41

感觉是个裸题 然后居然调了40分钟 逻辑不怎么严谨

对待区间合并的问题上居然没有考虑在up函数里面提取左右孩子的边界

难道是做裸题太不够紧张了

#include<stdio.h>#include<cstdio>#include<algorithm>#include<string.h>using namespace std;#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((l+r)>>1)#define maxn 111111int lnum[maxn<<2],rnum[maxn<<2],lsum[maxn<<2],msum[maxn<<2],rsum[maxn<<2];int set[maxn<<2];int num[maxn];int n,m;void up(int rt,int l,int r,int fl){    lnum[rt]=lnum[ls];rnum[rt]=rnum[rs];    msum[rt]=max(msum[ls],msum[rs]);    lsum[rt]=lsum[ls];rsum[rt]=rsum[rs];        if(rnum[ls]<lnum[rs]){        if((mid-l+1)==lsum[rt])lsum[rt]+=lsum[rs];        if((r-mid)==rsum[rt])rsum[rt]+=rsum[ls];        msum[rt]=max(msum[rt],lsum[rs]+rsum[ls]);    }}void down(int rt,int l,int r){    if(set[rt]!=-1){        set[ls]=set[rs]=set[rt];        msum[ls]=msum[rs]=lsum[ls]=rsum[ls]=lsum[rs]=rsum[rs]=1;        lnum[ls]=rnum[ls]=lnum[rs]=rnum[rs]=set[rt];        set[rt]=-1;    }}void build(int rt,int l,int r){    lnum[rt]=num[l];rnum[rt]=num[r];    set[rt]=-1;    if(l==r){        lsum[rt]=1;rsum[rt]=1;msum[rt]=1;        return ;    }    build(ls,l,mid);    build(rs,mid+1,r);    up(rt,l,r,1);}void ins(int rt,int l,int r,int L,int R,int w){    if(L<=l&&r<=R){        msum[rt]=lsum[rt]=rsum[rt]=1;        lnum[rt]=rnum[rt]=w;        set[rt]=w;        return ;    }    down(rt,l,r);    if(L<=mid)ins(ls,l,mid,L,R,w);    if(mid<R)ins(rs,mid+1,r,L,R,w);    up(rt,l,r,0);}int query(int rt,int l,int r,int L,int R){    if(L<=l&&r<=R)return msum[rt];    down(rt,l,r);    if(mid<L)return query(rs,mid+1,r,L,R);    else if(mid>=R) return query(ls,l,mid,L,R);    else{        int ltmp=query(ls,l,mid,L,mid);        int rtmp=query(rs,mid+1,r,mid+1,R);        int ll=min(rsum[ls],mid-L+1);        int rr=min(lsum[rs],R-mid);        int mi=max(ltmp,rtmp);        if(rnum[ls]<lnum[rs])mi=max(mi,ll+rr);        return mi;    }}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=1;i<=n;++i)scanf("%d",&num[i]);        build(1,1,n);        char op[5];        int a,b,c;        while(m--){            scanf("%s%d%d",op,&a,&b);            if(*op=='Q')printf("%d\n",query(1,1,n,a,b));            else {scanf("%d",&c);ins(1,1,n,a,b,c);}        }    }    return 0;}

0 0