也是一个求最长连续单调区间的问题,不同于HDU 3308LCIS的是,单点更新变成了区间成段增加,没关系同样的方法可破之。由于是成段更新,所以比更新区间小的区间是最大连续区间长度是不变的,所以更新sum[rt],lsum[rt],rsum[rt]只需要更新到这些区间,然后向上合并就行了。

但是速度还是慢了一点699ms,总觉得哪里还有改进的地方。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define N 111111 using namespace std;
int sum[N<<],lsum[N<<],rsum[N<<],add[N<<],A[N];
int n,q; void PushUp(int rt,int m,int mid)
{
lsum[rt]=lsum[rt<<];
rsum[rt]=rsum[rt<<|];
int t=;
if(A[mid+]>A[mid])
{
if(lsum[rt]==(m-(m>>)))
lsum[rt]+=lsum[rt<<|];
if(rsum[rt]==(m>>))
rsum[rt]+=rsum[rt<<];
t=rsum[rt<<]+lsum[rt<<|];
}
sum[rt]=max(t,max(sum[rt<<],sum[rt<<|]));
} void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",A+l);
sum[rt]=lsum[rt]=rsum[rt]=;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
PushUp(rt,r-l+,m);
} void update(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
return;
int m=(l+r)>>;
if(L<=m)
update(L,R,lson);
if(R>m)
update(L,R,rson);
PushUp(rt,r-l+,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)>>;
int ans=;
if(R<=m)
ans=max(ans,query(L,R,lson));
else if(L>m)
ans=max(ans,query(L,R,rson));
else
{
ans=max(ans,query(L,R,lson));
ans=max(ans,query(L,R,rson));
int ll,rr;
if(m-L+>=rsum[rt<<])
ll=rsum[rt<<];
else ll=m-L+;
if(R-m>=lsum[rt<<|])
rr=lsum[rt<<|];
else rr=R-m;
if(A[m+]>A[m])
ans=max(ans,ll+rr);
}
return ans;
} int main(void)
{
int T;
int a,b,v;
char op[];
for(int t=scanf("%d",&T); t<=T; t++)
{
memset(add,,sizeof(add));
printf("Case #%d:\n",t);
scanf("%d%d",&n,&q);
build(,n,);
while(q--)
{
scanf("%s",op);
if(op[]=='a')
{
scanf("%d%d%d",&a,&b,&v);
for(int i=a;i<=b;i++)
A[i]+=v;
update(a,b,,n,);
}
else
{
scanf("%d%d",&a,&b);
int ans=query(a,b,,n,);
printf("%d\n",ans);
}
}
}
return ;
}

方法二:看了下别人代码,发现每个区间可以用left[rt],right[rt]将区间端点值存起来,这样每次更新的时候更新端点值就可以了:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define N 111111 using namespace std;
int sum[N<<],lsum[N<<],rsum[N<<],add[N<<],left[N<<],right[N<<];
int n,q; void PushUp(int rt,int m)
{
left[rt]=left[rt<<];
right[rt]=right[rt<<|];
lsum[rt]=lsum[rt<<];
rsum[rt]=rsum[rt<<|];
int t=;
if(left[rt<<|]>right[rt<<])
{
if(lsum[rt]==(m-(m>>)))
lsum[rt]+=lsum[rt<<|];
if(rsum[rt]==(m>>))
rsum[rt]+=rsum[rt<<];
t=rsum[rt<<]+lsum[rt<<|];
}
sum[rt]=max(t,max(sum[rt<<],sum[rt<<|]));
}
void PushDown(int rt)
{
if(add[rt])//这里用来向下更新add[rt],
{
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
left[rt<<]+=add[rt];
right[rt<<]+=add[rt];
left[rt<<|]+=add[rt];
right[rt<<|]+=add[rt];
add[rt]=;
} }
void build(int l,int r,int rt)
{
add[rt]=;
if(l==r)
{
scanf("%d",left+rt);
right[rt]=left[rt];
sum[rt]=lsum[rt]=rsum[rt]=;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
PushUp(rt,r-l+);
} void update(int L,int R,int v,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
left[rt]+=v;
right[rt]+=v;
add[rt]+=v;
return;
}
int m=(l+r)>>;
PushDown(rt);
if(L<=m)
update(L,R,v,lson);
if(R>m)
update(L,R,v,rson);
PushUp(rt,r-l+);
} int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
return sum[rt];
PushDown(rt);
int m=(l+r)>>;
int ans=;
if(R>m)
ans=max(ans,query(L,R,rson));
if(L<=m)
ans=max(ans,query(L,R,lson));
if(left[rt<<|]>right[rt<<]&&L<=m&&R>m)
{
int ll,rr;
if(m-L+>=rsum[rt<<])
ll=rsum[rt<<];
else ll=m-L+;
if(R-m>=lsum[rt<<|])
rr=lsum[rt<<|];
else rr=R-m;
ans=max(ans,ll+rr);
}
return ans;
} int main(void)
{
int T;
int a,b,v;
char op[];
for(int t=scanf("%d",&T); t<=T; t++)
{
memset(add,,sizeof(add));
printf("Case #%d:\n",t);
scanf("%d%d",&n,&q);
build(,n,);
while(q--)
{
scanf("%s",op);
if(op[]=='a')
{
scanf("%d%d%d",&a,&b,&v);
update(a,b,v,,n,);
}
else
{
scanf("%d%d",&a,&b);
int ans=query(a,b,,n,);
printf("%d\n",ans);
}
}
}
return ;
}

UESTC 1425 Another LCIS的更多相关文章

  1. UESTC 360 Another LCIS

    Another LCIS Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on UESTC. Original ...

  2. (中等) UESTC 360 Another LCIS ,线段树+区间更新。

    Description: For a sequence S1,S2,⋯,SN, and a pair of integers (i,j), if 1≤i≤j≤N and Si<Si+1<S ...

  3. UESTC 360(1425) another LCIS

    这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧).后来才知道OJ移位了. 这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下 这道 ...

  4. uestc Another LCIS

    Another LCIS Time Limit: 1000 ms Memory Limit: 65536 kB Solved: 193 Tried: 2428 Description For a se ...

  5. 【37.07%】【UESTC 360】Another LCIS

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status F ...

  6. ACM:UESTC - 649 括号配对问题 - stack

      UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu ...

  7. hihoCoder 1425 : What a Beautiful Lake(美丽滴湖)

    hihoCoder #1425 : What a Beautiful Lake(美丽滴湖) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 ...

  8. UESTC 1015 Lweb and pepper --前,后缀最值

    题意: n种食物,每种含花椒的概率为Pi,现在已经选择了[L,R]这个区间(下标)的食物,要再选一个,使总的食物只有一种含花椒的概率最大,问选哪个最好,相同的选下标小的. 解法: 就不写解法了.此处有 ...

  9. BestCoder Round #87 1003 LCIS[序列DP]

    LCIS  Accepts: 109  Submissions: 775  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 65536/65 ...

随机推荐

  1. Memcached原理

    Memcached是一套高性能的.分布式内存对象缓存系统.它由C写成,以Key/Value的方式将数据储存在内存中. 一.Memcached特性 Memcached作为高速运行的分布式缓存服务器,具有 ...

  2. overflow:hiddden与绝对定位的应用场景的事例

    做一个点击查看显示详细信息的效果. 说一下问题描述,最外面的父元素overflow-parent设置了overflow:hidden, 然后子元素overflow-child没有设置overflow, ...

  3. 移动端和PC端通用的三级导航菜单栏

    免责声明: 本博客发布的所有信息资料都将尽可能注明出处.作者及日期,本人无意侵犯他人相关权益,如无意中侵犯了哪个媒体或个人的权益或知识产权,请留言或来信告之,本人将立即给予删除. Demo下载地址:h ...

  4. MVC小系列(九)【引入namespace】

    以前在页面引入一个namespace,可以这样: <%@ Import Namespace="Web.Helpers" %> 如果空间是所有页面都需要的,可以写进配置文 ...

  5. ios-异步消息同步问题-典型使用场景: 微信私信界面

    前言 在ios开发中常常会有聊天功能,一般简单聊天功能只传输文字,但是稍微复杂点儿会有图片发送功能了.最全而且可支持扩展的例如微信,qq 聊天功能了.传输方式各有千秋,如get,post,websoc ...

  6. 使用sqlldr命令导入资料到Oracle数据库表中的示例说明

    CSV: Comma-Separated Values(逗号分隔值)的缩写,是以逗号分隔字段的多行文本文件   sqlldr 是sql*loader的缩写,此工具在安装完整版的Oracle客户端后就有 ...

  7. Ext.Net学习笔记12:Ext.Net GridPanel Filter用法

    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...

  8. CSS当中color的四种表示方法

    这是我的第一篇博客,所以写的东西会比较简单. css当中,好多地方都会用到color属性,用来使html内容丰富多彩,例如:background-color:border-color: 第一种表示法使 ...

  9. 网卡添加VLAN TAG

    #modprobe 8021q 用命令 lsmod | grep 8021q 来检查 以配置网卡eth0为例,添加vlan号:1002 ================================ ...

  10. RD / RMDIR Command

    Quote from: http://ss64.com/nt/rd.html RD Delete folder(s) Syntax RD pathname RD /S pathname RD /S / ...