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 ...
随机推荐
- oracle根据pid查询出正在执行的执行语句
今天数据库访问突然很慢,通过top命令发现oracle的cpu使用率很高.同事建议查询一下看看是什么语句导致的oracle运行变慢.于是从网上查了一下,可以根据pid查询出正在执行的查询语句,发现是一 ...
- Bind开启IPv6功能
[root@localhost sbin]# ./named -v bind 9.5.1-p3-v3.0.9 1,服务器开启IPv6服务 网卡配置v6地址 [root@localhost ~]# if ...
- 重命名计算机名称导致TFS版本管理下的工作区问题的修复
1.问题 若在本地已有工作区之后,此时修改计算机名称重启生效后,打开本地的项目解决方案,输出窗口会提示如下图: 2.解决 输入命令:tf workspaces /collection:http://1 ...
- sql 游标循环遍历
写存储过程的时候碰到一个需要对数据进行遍历循环操作的问题,最后通过游标解决了,感觉很适用. declare @level varchar() declare @uid varchar() declar ...
- 20160327javaweb 之JSP入门
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- ACM/ICPC ZOJ1003-Crashing Balloon 解题代码
#include <iostream> using namespace std; int main() { int **array = new int *[100]; for ( int ...
- C++编程注意事项
1.所有成员变量在构造函数中进行初始化操作,如指针赋值为空,bool赋值为FALSE(默认为TRUE); 2.构造函数与析构函数配对出现,执行反向操作,保证执行析构之后,没有遗留问题存在: 3.如果需 ...
- 学习笔记_JDBC_1_Demo1_连接数据库的基本操作和步骤
常见错误:连数据库时,这句话String url = "jdbc:mysql://localhost/数据库名";数据库名可能和你建的数据库名不一样 1.安装Mysql,记住此时你 ...
- oracle 11g不能连接报ORA-12537+ora-609解决
操作系统: windows2008 数据库:oracle11g 问题发生:一套正常跑了一年的应用系统,忽然无法连接上数据库,但是另外一个应用可以正常链接,数据入库正常. 数据库服务器端查看: 使用 l ...
- window redis 安装配置
1 下载 https://github.com/MSOpenTech/redis/releases 当前最新版本为 redis-2.8.21 下载的为zip包,下载连接为:https://gith ...