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
- ACdream 1101 瑶瑶想要玩滑梯
- ACdream 1101 瑶瑶想要玩滑梯
- ACdream 1101 瑶瑶想要玩滑梯
- ACdream P1101 瑶瑶想要玩滑梯
- acdream oj 1101 瑶瑶想要玩滑梯
- ACDream 1101 瑶瑶想要玩滑梯 线段树
- ACdream 1101 瑶瑶想要玩滑梯 (线段树)(区间替换+区间查询LCIS)
- ACdream
- Acdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- 要做的事
- UINavigationController使用详解
- C语言比较 回车符和零的区别
- 软件工程
- POJ1680
- ACdream 1101 瑶瑶想要玩滑梯
- C语言实现 递归法 数字转换成字符串
- Linux下C获取文件的大小
- Oracle 权限
- java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠
- 常见渗透端口
- SQL优化规则
- RubyOnRails开发知识链接汇总
- HDU 3986 Harry Potter and the Final Battle(Dijkstra)