hdu 3308
来源:互联网 发布:Kafka数据怎么接入 编辑:程序博客网 时间:2024/06/11 19:46
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3308
线段树,区间合并的入门题啊。蛮好的。更新直接更新到底,查询注意。合并的情况。这个地方错了2次。
下面是AC代码:
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 100000+100;int a[maxn];struct node{ int l,r; int msum,lsum,rsum,lv,rv;}T[maxn<<2];void pushup(int id,int l,int r){ int m=(l+r)>>1; T[id].lv=T[id<<1].lv; T[id].rv=T[id<<1|1].rv; T[id].msum=max(T[id<<1].msum,T[id<<1|1].msum); if(T[id<<1].rv<T[id<<1|1].lv){ T[id].msum=max(T[id].msum,T[id<<1].rsum+T[id<<1|1].lsum); } T[id].lsum=T[id<<1].lsum; T[id].rsum=T[id<<1|1].rsum; if(T[id<<1].lsum==m-l+1&&T[id<<1].rv<T[id<<1|1].lv){ T[id].lsum+=T[id<<1|1].lsum; } if(T[id<<1|1].rsum==r-m&&T[id<<1].rv<T[id<<1|1].lv){ T[id].rsum+=T[id<<1].rsum; }}void build(int id,int l,int r){ T[id].l=l;T[id].r=r; if(l==r) { T[id].lv=T[id].rv=a[l]; T[id].msum=T[id].lsum=T[id].rsum=1; return; } int m=(l+r)>>1; build(id<<1,l,m); build(id<<1|1,m+1,r); pushup(id,l,r);}void update(int id,int l,int val){ if(T[id].l==l&&T[id].r==l){ T[id].lv=T[id].rv=val; T[id].msum=T[id].lsum=T[id].rsum=1; return; } int m=(T[id].l+T[id].r)>>1; if(m>=l) update(id<<1,l,val); else update(id<<1|1,l,val); pushup(id,T[id].l,T[id].r);}int query(int id,int l,int r){ if(T[id].l==l&&T[id].r==r){ return T[id].msum; } int m=(T[id].l+T[id].r)>>1; if(m>=r){ return query(id<<1,l,r); } else if(l>m){ return query(id<<1|1,l,r); } else{ int a=query(id<<1,l,m); int b=query(id<<1|1,m+1,r); if(T[id<<1].rv<T[id<<1|1].lv){ int lsum=min(T[id<<1].rsum,m-l+1); int rsum=min(T[id<<1|1].lsum,r-m); return max(a,max(lsum+rsum,b)); } else{ return max(a,b); } }}int main(){ int t,n,m,l,r; char str[200]; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); for(int i=0;i<m;i++){ scanf("%s%d%d",str,&l,&r); if(str[0]=='Q'){ l++;r++; printf("%d\n",query(1,l,r)); } else{ l++; update(1,l,r); } } } return 0;}
- hdu 3308
- hdu 3308
- hdu 3308
- HDU 3308
- hdu 3308
- hdu 3308 LCIS
- hdu 3308 LCIS
- HDU 3308(LCIS)
- hdu 3308 LCIS
- Hdu 3308 LCIS
- hdu(3308)LCIS
- HDU 3308 LCIS
- hdu 3308 LCIS
- HDU 3308 LCIS
- HDU 3308 LCIS
- HDU 3308 LCIS
- HDU-3308-LCIS
- HDU 3308 LCIS
- 【总结】10.4
- 从地址角度看
- param标签
- android中的系统广播
- MSDE2000安装过程 2007-12-20
- hdu 3308
- Windows CE版本以及与linux比较
- #符合使用的意义
- 如何安装MSDE2000A
- Microsoft Visual Studio 2010 遇到了异常,可能是由某个扩展导致的
- push标签
- SQLDMO使用说明 (SQL Server2000+VB6下测试通过)
- HTTPS
- SQLDMO实例(SQL Server2000+VB6下测试通过)