UESTC 1425 Another LCIS
也是一个求最长连续单调区间的问题,不同于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的更多相关文章
- UESTC 360 Another LCIS
Another LCIS Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on UESTC. Original ...
- (中等) 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 ...
- UESTC 360(1425) another LCIS
这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧).后来才知道OJ移位了. 这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下 这道 ...
- uestc Another LCIS
Another LCIS Time Limit: 1000 ms Memory Limit: 65536 kB Solved: 193 Tried: 2428 Description For a se ...
- 【37.07%】【UESTC 360】Another LCIS
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status F ...
- ACM:UESTC - 649 括号配对问题 - stack
UESTC - 649 括号配对问题 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu ...
- hihoCoder 1425 : What a Beautiful Lake(美丽滴湖)
hihoCoder #1425 : What a Beautiful Lake(美丽滴湖) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 ...
- UESTC 1015 Lweb and pepper --前,后缀最值
题意: n种食物,每种含花椒的概率为Pi,现在已经选择了[L,R]这个区间(下标)的食物,要再选一个,使总的食物只有一种含花椒的概率最大,问选哪个最好,相同的选下标小的. 解法: 就不写解法了.此处有 ...
- BestCoder Round #87 1003 LCIS[序列DP]
LCIS Accepts: 109 Submissions: 775 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65 ...
随机推荐
- net.sf.json的jar包:JSONArray
今天在用maven添加net.sf.json的jar包的时候,代码如下: ? 1 2 3 4 5 <dependency> <groupId>net.sf.json-l ...
- Jquery获得控件值的方法
一 Jquery获得服务器控件值的方法 由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<a ...
- html5 meta标签属性整理
声明文档使用的字符编码 <meta charset='utf-8'> 声明文档的兼容模式 //指示IE以目前可用的最高模式显示内容<meta http-equiv="X-U ...
- 20160405javaweb之jdbc
一.数据库驱动的概念.JDBC 数据库厂商提供的用来操作数据库用的jar包就是数据库驱动.各个厂商如果提供各自的数据库驱动的话会导致开发人员学习成本太高,所以sun公司提供了一套数据库驱动应该遵循的接 ...
- 如何恢复oracle中已删除的表
在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,但对于诸如drop/truncate等DDL语句却尚不支持.进入Oracle10g,这一缺陷得到了弥补.可以将丢失掉的表 ...
- 我的微软.net演进路线图
原文地址:我的微软.net演进路线图 我的微软.net演进路线图 我的这几年,编程方面主要是跟在微软旗下奔跑的,主要语言是C# 集成开发环境(IDE) .NET Framework版本 介入年份 Vi ...
- pop动画大全 只能时代程序员更应该关心效果而不是冷冰冰的代码
下载地址 https://pan.baidu.com/s/1o8pQWau
- ReactiveCocoa 入门学习 (一)
引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...
- @class的基本使用
2-@class 的基本使用 1, @class的作用 @class 允许简单的引用类,即类的声明.告诉编译器,后面代码中可能会使用到的类名. 好比函数声明一样. 2, #import的作用 与 #i ...
- c语言数组不同初始化方式的结果
第一种初始化方式: #include <stdio.h> int main() { int numbers[5]={12,14}; for (int i=0; i<5; i++) { ...