hdu 3308(线段树区间合并)
来源:互联网 发布:虚拟机的网络模式 编辑:程序博客网 时间:2024/05/18 01:59
线段树的区间并,这道题是比较简单的一个,,重点是细节的处理
#include<bits/stdc++.h>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define sf scanf#define pf printf#define mem(a,b) memset(a,b,sizeof(a));#define rep(i,a,b) for(int i=(a);i<=(b);++i)#define MP make_pair#define ULL unsigned long long#define LL long long#define inf 0x3f3f3f3f#define md ((ll[i]+rr[i])>>1)#define ls (i<<1)#define rs (ls|1)#define eps 1e-5#define N 200050#define ree freopen("in.txt","r",stdin);#define bug pf("----------------");//2017年09月25日21:29:24int ll[N<<2],rr[N<<2],a[N],lx[N<<2],rx[N<<2],mx[N<<2];int n,m;int len(int i){ return rr[i]-ll[i]+1;}void up(int i){ mx[i]=max(mx[ls],mx[rs]); if(a[md]<a[md+1]){ mx[i]=max(mx[i],rx[ls]+lx[rs]); if(lx[ls]==len(ls)) lx[i]=len(ls)+lx[rs]; else lx[i]=lx[ls]; if(rx[rs]==len(rs)) rx[i]=len(rs)+rx[ls]; else rx[i]=rx[rs]; } else{ lx[i]=lx[ls],rx[i]=rx[rs]; }}void build(int l,int r,int i){ ll[i]=l,rr[i]=r; if(l==r){ mx[i]=lx[i]=rx[i]=1; return ; } build(l,md,ls);build(md+1,r,rs); up(i);}void update(int p,int val,int i){ if(ll[i]==rr[i])return ; if(p<=md) update(p,val,ls); else update(p,val,rs); up(i);}int query(int l,int r,int i){ if(ll[i]==l&&rr[i]==r) return mx[i]; if(r<=md)return query(l,r,ls); if(l>md)return query(l,r,rs); if(a[md]>=a[md+1]) return max(query(l,md,ls),query(md+1,r,rs)); int ret=max(query(l,md,ls),query(md+1,r,rs)); int head=max(l,md-rx[ls]+1); int tail=min(r,md+lx[rs]); ret=max(ret,tail-head+1); return ret;}int main(){ //ree int cas; sf("%d",&cas); while(cas--){ sf("%d%d",&n,&m); for(int i=1;i<=n;++i)sf("%d",&a[i]); build(1,n,1); int k,v,l,r; while(m--){ char op[2];sf("%s",op); if(op[0]=='Q'){ sf("%d%d",&l,&r); l++;r++; pf("%d\n",query(l,r,1)); continue; } sf("%d%d",&k,&v); k++; a[k]=v; update(k,v,1); } }}
阅读全文
0 0
- HDU 3308 线段树+区间合并
- hdu 3308 LCIS 线段树 区间合并
- hdu 3308LCIS 线段树 区间合并
- [HDU 3308]LCIS[线段树][区间合并]
- hdu 3308 线段树区间合并
- hdu 3308 线段树区间合并
- hdu 3308 LCIS(线段树区间合并)
- hdu 3308 线段树+区间合并
- hdu 3308 线段树+区间合并
- HDU 3308 线段树区间合并
- hdu 3308 线段树+区间合并
- HDU 3308 LCIS 线段树区间合并
- hdu 3308-线段树基本区间合并
- HDU 3308 线段树之区间合并
- HDU 3308 LCIS(线段树区间合并)
- hdu 3308(线段树区间合并)
- hdu 3308(线段树的区间合并)
- HDU 3308【线段树--c++版区间合并,dp】
- django基础入门(3)-设计模型
- 2017-9-25
- 华为交换机基本视图
- 泛型之列表的创建和使用
- html笔记——可预约当日的select制作
- hdu 3308(线段树区间合并)
- java compiler level does not match the version of the installed java project facet错误的解决
- KMP算法的部分匹配值的计算
- Cg Programming/Unity/Order-Independent Transparency
- Lucene原理分析
- mysql密码管理
- 49.Scala中Variance代码实战及其在Spark中的应用源码解析
- Java常用数据结构之HashMap
- PHP初识