也是一个求最长连续单调区间的问题,不同于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. oracle根据pid查询出正在执行的执行语句

    今天数据库访问突然很慢,通过top命令发现oracle的cpu使用率很高.同事建议查询一下看看是什么语句导致的oracle运行变慢.于是从网上查了一下,可以根据pid查询出正在执行的查询语句,发现是一 ...

  2. WinForm窗体的托盘最小化实现代码

    //窗体最小化时候将窗体隐藏掉,同时让托盘控件显示 private void Form1_SizeChanged(object sender, EventArgs e) { if(this.Windo ...

  3. 18、HTML

    HTML 超文本标记语言(Hyper Text Markup Language). 用来描述网页的一种语言. HTML标签 由尖括号包围的关键词. 如:<html> 通常是成对出现的,开始 ...

  4. 读《编写高质量代码:改善JavaScript程序的188个建议》1

    建议3:减少全局变量污染 定义全局变量有3种方式: ❑在任何函数外面直接执行var语句. var f='value'; ❑直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中, ...

  5. SQL Server2008R无法登录的解决方案(系统文件损坏)1814 18456....不看别后悔,有用请点赞

    废话 早上一开电脑,黑屏幕跑一些修复系统的代码....进入系统后,sql server连接不上 正文 原因:sql server的服务自动关闭了,并且启动失败 windows日志信息:传递给数据库 ' ...

  6. SQL Server内连接、外连接、交叉连接

    前言 在数据库查询中,我们常常会用到的表连接查询,而我自己在工作中也是时常用这些表连接查询.而就在刚刚我却还没有搞清楚数据库表连接到底有哪几种, 这几种表连接查询方式又有什么区别,实属惭愧!借以此文以 ...

  7. onActivityResult不被执行的问题。

    1.首先,返回的Activity必须使用startActivityForResult启动. 2.其次,在返回的Activity中必须保证setResult方法在finish方法之前执行,否则onAct ...

  8. Library cache lock 故障解决一例

    今天收到同事电话,说是数据库中一张名为acct_balance进行操作是奇慢,第一反映是不是扫行计划有问题,结果我错了,现将过程记录下来. 用pl/sql连上数据库情况:1.对acct_balance ...

  9. CocoaPods安装过程中的大坑

    一.CocoaPods是什么? CocoaPods是一个用Ruby写的.负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中的.统一管理第三方开源库,为我们节省设置和更新第三方开源库 ...

  10. javascript document对象 第21节

    <html> <head> <title>DOM对象</title> <style type="text/css"> t ...