还是像以前那样维护下次出现位置,计算影响

其实不难,思维盲点,受到做最大子段和的影响

其实这里可以直接维护当前每个位置的子段和,再记录一个历史最大和

当然tag也需要记录当前tag和历史(距离上次push)最大累加

 type node=record
x,y,id:longint;
end; var lazy,tree:array[..*,..] of longint;
ans,next,a:array[..] of longint;
last:array[-..] of longint;
q:array[..] of node;
i,j,n,m:longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r:longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=q[(l+r) shr ].x;
repeat
while q[i].x>x do inc(i);
while x>q[j].x do dec(j);
if i<=j then
begin
swap(q[i],q[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure get(i,x0,x1:longint);
begin
tree[i,]:=max(tree[i,],tree[i,]+max(x0,x1));
lazy[i,]:=max(lazy[i,],lazy[i,]+max(x0,x1));
inc(lazy[i,],x1);
inc(tree[i,],x1);
end; procedure update(i:longint);
begin
tree[i,]:=max(tree[i*,],tree[i*+,]);
tree[i,]:=max(tree[i*,],tree[i*+,]);
end; procedure push(i:longint);
begin
if (lazy[i,]=) and (lazy[i,]=) then exit;
get(i*,lazy[i,],lazy[i,]);
get(i*+,lazy[i,],lazy[i,]);
lazy[i,]:=;
lazy[i,]:=;
end; procedure add(i,l,r,x,y,z:longint);
var m:longint;
begin
if (x<=l) and (y>=r) then get(i,,z)
else begin
m:=(l+r) shr ;
push(i);
if x<=m then add(i*,l,m,x,y,z);
if y>m then add(i*+,m+,r,x,y,z);
update(i);
end;
end; function ask(i,l,r,x:longint):longint;
var m:longint;
begin
if l=r then exit(tree[i,])
else begin
m:=(l+r) shr ;
push(i);
if x<=m then exit(ask(i*,l,m,x))
else exit(max(tree[i*,],ask(i*+,m+,r,x)));
end;
end; begin
readln(n);
for i:= to n do
read(a[i]);
for i:=n downto do
begin
next[i]:=last[a[i]];
last[a[i]]:=i;
end;
readln(m);
for i:= to m do
begin
readln(q[i].x,q[i].y);
q[i].id:=i;
end;
sort(,m);
j:=;
for i:=n downto do
begin
if next[i]= then next[i]:=n+;
add(,,n,i,next[i]-,a[i]);
while (j<=m) and (q[j].x=i) do
begin
ans[q[j].id]:=ask(,,n,q[j].y);
inc(j);
end;
if j=m+ then break;
end;
for i:= to m do
writeln(ans[i]);
end.

bzoj2482的更多相关文章

  1. 【BZOJ2482】[Spoj1557] Can you answer these queries II 线段树

    [BZOJ2482][Spoj1557] Can you answer these queries II Description 给定n个元素的序列. 给出m个询问:求l[i]~r[i]的最大子段和( ...

  2. BZOJ2482: [Spoj1557] Can you answer these queries II

    题解: 从没见过这么XXX的线段树啊... T_T 我们考虑离线做,按1-n一个一个插入,并且维护区间[ j,i](i为当前插入的数)j<i的最优值. 但这个最优值!!! 我们要保存历史的最优值 ...

随机推荐

  1. 高德开发 android 出现 key 鉴权失败

    环境windows + android studio 原因: 曾经更改过key.store 解决办法: 首先运行cmd移动到keystore的目录下keytool -list -keystore 文件 ...

  2. IP地址格式控制

    /// <summary> /// 验证IP格式是否输入正确 /// </summary> /// <param name="ip"></ ...

  3. Http之Get/Post请求区别

    Http之Get/Post请求区别 1.HTTP请求格式: <request line> <headers> <blank line> [<request-b ...

  4. 常用的Eclilpse插件列表以及安装方式总结

    Eclipse常用插件的安装方式总结: 1.Maven Integration for Eclipse WTP     作用:用来方便开发和使用maven项目.     安装方式:Eclipse Ma ...

  5. SVN--从本地检出项目至服务器报错--禁止访问

    错误描述: 原因:这是访问权限限制引起的. 查看/svn/test目录的权限--之前我修改过的 现在添加一个user就好了--这个添加的developer是我之前导入本地项目时已经验证过的,所以再导入 ...

  6. Spring实现AOP的4种方式(转)

    转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...

  7. 数字PID控制算法

    增量式PID控制算法 量式PID控制算法 2009-07-18 10:33 (转载 出处blog.ednchina.com/tengjingshu )blog.ednchina.com/tengjin ...

  8. 剑指offer--面试题19

    题目:求二叉树镜像 根据作者思路,自己所写代码如下: void BinaryTreeMirror(BinaryTreeNode* pRoot) { if(pRoot == NULL) return; ...

  9. javascript数学计算

    ◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数:◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数:◎Math.round()执行标准舍入,即它总 ...

  10. java 中 String 类的几个问题

    首先,我们要搞清楚,在java中,引用和基本数据类型是存储在栈中的.而对象是存储在堆中的. 只有一个例外,就是String对象. 例如: String str1="test"; S ...