hdu3308(线段树区间合并)
来源:互联网 发布:stm8单片机 编辑:程序博客网 时间:2024/06/06 01:55
链接:点击打开链接
题意:给出n个数,有两种操作一种为(U x y)将x点的值改为y,另一种为(Q x y)求区间[x,y]最长连续递增序列长度
代码:
#include <map>#include <queue>#include <stack>#include <vector>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int siz=100005;int a[siz],sum[siz<<2],lsum[siz<<2],rsum[siz<<2];void pushup(int rt,int l,int r){ lsum[rt]=lsum[rt<<1]; rsum[rt]=rsum[rt<<1|1]; sum[rt]=max(sum[rt<<1],sum[rt<<1|1]); int m=(l+r)>>1; if(a[m]<a[m+1]){ if(lsum[rt<<1]==(m-l+1)) lsum[rt]+=lsum[rt<<1|1]; if(rsum[rt<<1|1]==(r-m)) rsum[rt]+=rsum[rt<<1]; sum[rt]=max(sum[rt],rsum[rt<<1]+lsum[rt<<1|1]); } //区间合并}void build(int l,int r,int rt){ if(l==r){ sum[rt]=1; lsum[rt]=rsum[rt]=1; return; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); pushup(rt,l,r);}void Change(int p,int q,int l,int r,int rt){ if(l==r){ a[l]=q; return; } int m=(l+r)>>1; if(p<=m) Change(p,q,l,m,rt<<1); else Change(p,q,m+1,r,rt<<1|1); pushup(rt,l,r);}int query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) return sum[rt]; int m=(l+r)>>1,ans=1; if(L<=m) //答案一共三种可能,在左区间或右区间或横跨两个区间 ans=max(ans,query(L,R,l,m,rt<<1)); if(R>m) ans=max(ans,query(L,R,m+1,r,rt<<1|1)); if(L<=m&&R>=m&&a[m]<a[m+1]) ans=max(ans,min(m-L+1,rsum[rt<<1])+min(R-m,lsum[rt<<1|1])); return ans;}int main(){ //lsum为区间左端点开始长度 char c; //rsum为区间右端点开始长度 int t,n,m,u,v,i; //sum为区间最长长度 scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); while(m--){ cin>>c>>u>>v; if(c=='Q'){ u++,v++; printf("%d\n",query(u,v,1,n,1)); } else{ u++; Change(u,v,1,n,1); } } }return 0;}
阅读全文
0 0
- hdu3308 线段树区间合并
- hdu3308 线段树 区间合并
- HDU3308->线段树区间合并
- hdu3308(线段树区间合并)
- HDU3308线段树区间合并
- hdu3308(线段树,区间合并)
- HDU3308:LCIS(线段树区间合并)
- hdu3308 LCIS(线段树区间合并)
- hdu3308 LCIS 线段树 区间合并
- 线段树区间合并 hdu3308 LCIS
- HDU3308-LCIS-线段树区间合并
- hdu3308(线段树,区间合并)
- HDU3308 LCIS(线段树区间合并)
- hdu3308 线段树 区间合并,单点跟新
- 线段树区间维护hdu3308
- HDU3308 线段树区间更新
- 线段树区间合并(POJ 3667 Hotel ,HDU HDU3308 LCIS)
- HDU3308区间合并+单点更新
- 单机千万并发连接实战
- python 把一个随机长度整数组分成两组的差值最小
- Linux下链表的使用及探究
- CenterOS7-minimal
- SDN 技术指南(一):架构概览
- hdu3308(线段树区间合并)
- selenium webdriver 学习总结-JUnit4 入门_补充Annotation(三)
- java反射学习(结合工厂方法)
- c冒泡排序
- selenium webdriver 学习总结-JUnit4 入门_补充枚举 (三)
- C++ explicit关键字
- jdbc增删改查的工具类
- 小工具:火车票查询
- Java多线程--对thread.join的理解