也是一个求最长连续单调区间的问题,不同于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. skynet启动过程_1

    skynet的启动时需带个配置文件,这个文件其实是作为lua全局变量用的,见 int main(int argc, char *argv[]) { const char * config_file = ...

  2. hdu 1563 Find your present!

    Find your present! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. Magento 的程序架构与流程

    以下是分别详细解读分析程序的各层次源码: MAGENTO_ROOT: //入口文件 /index.php -----–| 1.判断php版本是否大于5.22.引入Magento主要的中心类/app/M ...

  4. js局部变量与全局变量

    在最外层定义的是全局变量 如果在函数内部不用var声明直接赋值的变量,那么这个变量也是全局变量 在函数内部用var声明的变量叫做局部变量 定义在最开头的全局变量在整个js范围内都可以访问到,都可以使用 ...

  5. 20151217jqueryUI学习笔记

    工具提示(tooltip),是一个非常实用的 UI.它彻底扩展了 HTML 中的 title 属性,让提示更加丰富,更加可控制,全面提升了用户体验.一. 调用 tooltip()方法在调用 toolt ...

  6. 2014年的Google I/O app设计中的材料设计-渣渣的翻译

    又是一篇翻译,用了三个多小时.http://android-developers.blogspot.co.id/2014/08/material-design-in-2014-google-io-ap ...

  7. 四、使用Maven和使用Eclipse构建javaWeb项目

    环境前边已经搭建过了,我们就再弄了. 1.使用Maven构建javaWeb项目 (1).键入以下命令: $ mvn archetype:generate -DgroupId=com.holytax.w ...

  8. linux 搭建pptpd vpn(转,备忘)

    1.第一步需要安装PPTP,以用来提供VPN服务.sudo apt-get install pptpd注:如果有问题的话比如提示找不到之类的,apt-get update 一下应该就可以了,然后再来一 ...

  9. java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别 (2016-07-12)

    分别介绍这几种关系: UML关系:继承(泛化).实现.依赖.关联.聚合.组合的联系与区别 一.表示符号上的区别 二.具体区别与联系 1. 继承/泛化(Generalization) [泛化关系]:是一 ...

  10. poj 2763: [JLOI2011]飞行路线(spfa分层图最短路)

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2156 Solved: 818 [Submit][Statu ...