HDU 3308 LCIS
2013-11-15 16:49
204 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3308
题目要实现的就是给一个数串,对这个串有两个操作,一个是查询,另一个是修改。查询的是给定区间中最长递增串的长度。
很明显这就是一个单点更新和区间合并的问题,因为对线段树不熟悉,所以在保存状态的时候出现了问题,好歹最后过了。281ms
代码:
题目要实现的就是给一个数串,对这个串有两个操作,一个是查询,另一个是修改。查询的是给定区间中最长递增串的长度。
很明显这就是一个单点更新和区间合并的问题,因为对线段树不熟悉,所以在保存状态的时候出现了问题,好歹最后过了。281ms
代码:
#include <iostream> #include <cstdio> #include <stdlib.h> #include <memory.h> #define maxn 100010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int lsum[maxn<<2],rsum[maxn<<2],sum[maxn<<2],cur[maxn<<2],lcur[maxn<<2],rcur[maxn<<2]; int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} void PushUP(int rt,int m) { sum[rt]=max(sum[rt<<1],sum[rt<<1|1]); lcur[rt]=lcur[rt<<1],rcur[rt]=rcur[rt<<1|1]; rsum[rt]=rsum[rt<<1],lsum[rt]=lsum[rt<<1|1]; if(rcur[rt<<1]<lcur[rt<<1|1]) { sum[rt]=max(sum[rt],rsum[rt<<1|1]-lsum[rt<<1]+1); if(rsum[rt]>=m)rsum[rt]=rsum[rt<<1|1]; if(lsum[rt]<=m+1)lsum[rt]=lsum[rt<<1]; } } void bulid(int l,int r,int rt) { if(l==r) { scanf("%d",&cur[rt]); lcur[rt]=rcur[rt]=cur[rt]; sum[rt]=1;lsum[rt]=l;rsum[rt]=r; return; } int m=(l+r)>>1; bulid(lson); bulid(rson); PushUP(rt,m); } void update(int p, int sc,int l,int r,int rt) { if(l==r) { lcur[rt]=rcur[rt]=cur[rt]=sc; return; } int m=(l+r)>>1; if(p<=m)update(p,sc,lson); else update(p,sc,rson); PushUP(rt,m); } 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; if(R<=m)return query(L,R,lson); if(L>m)return query(L,R,rson); int ret=max(query(L,R,lson),query(L,R,rson)); if(rcur[rt<<1]<lcur[rt<<1|1])ret=max(ret,min(R,rsum[rt<<1|1])-max(L,lsum[rt<<1])+1); return ret; } int main() { // freopen("in.txt","r",stdin); int m,n,a,b; int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); bulid(1,n,1); while(m--){ char op[2]; scanf("%s%d%d",op,&a,&b); if(op[0]=='Q')printf("%d\n",query(a+1,b+1,1,n,1)); else update(a+1,b,1,n,1); } } return 0; }
相关文章推荐
- 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(线段树+区间合并+最长递增连续子串)
- HDU 3308 LCIS (线段树·单点更新·区间合并)
- 【HDU】3308 LCIS (线段树-区间合并)
- hdu 3308 LCIS(区间合并)
- hdu 3308 LCIS(线段树)
- HDU 3308——LCIS(线段树,区间合并,最长连续递增子序列)
- hdu 3308 LCIS 最大连续递增字串长 线段树区间合并
- HDU-3308 LCIS 线段树 区间处理