bzoj2482
还是像以前那样维护下次出现位置,计算影响
其实不难,思维盲点,受到做最大子段和的影响
其实这里可以直接维护当前每个位置的子段和,再记录一个历史最大和
当然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的更多相关文章
- 【BZOJ2482】[Spoj1557] Can you answer these queries II 线段树
[BZOJ2482][Spoj1557] Can you answer these queries II Description 给定n个元素的序列. 给出m个询问:求l[i]~r[i]的最大子段和( ...
- BZOJ2482: [Spoj1557] Can you answer these queries II
题解: 从没见过这么XXX的线段树啊... T_T 我们考虑离线做,按1-n一个一个插入,并且维护区间[ j,i](i为当前插入的数)j<i的最优值. 但这个最优值!!! 我们要保存历史的最优值 ...
随机推荐
- 【转,未试】android 9path教程与去黑边
本帖最后由 ArcherFMY 于 2013-4-24 17:39 编辑 <ignore_js_op> draw9patch.zip (124.83 KB) 这是Draw9patch& ...
- BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 题解: Matrix-tree定理解决生成树计数问题,其中用到高斯消元法求上三角矩 ...
- 【UVA】【10828】随机程序
数学期望/高斯消元/马尔可夫过程 刘汝佳老师白书上的例题- -b 本体不满足拓扑关系,但马尔可夫过程是可以高斯消元解的…… 用「高斯·约当消元」更方便! //UVA 10828 #include< ...
- Jsonp 前后端交互操作
今天,因为项目的需要,研究了一下JSONP,特在此记录一下 ,希望可以帮助那些有疑惑的朋友们,本人也是刚学,高手略过即可. 关于Jsonp的定义就不说了,网上一片,大家可以自己查询.我就在此直接进入正 ...
- pku ppt some problem
The Triangle http://poj.org/problem?id=1163 暴力dfs的话,每个节点有两条路可以走,那么n个节点复杂度就是2^n n=100 超时 dp来做 就优 ...
- PAT-乙级-1047. 编程团体赛(20)
1047. 编程团体赛(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 编程团体赛的规则为:每个参赛队由若 ...
- WPF Loader
xaml <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml ...
- JavaScript 函数参数是传值(byVal)还是传址(byRef)?
对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object ...
- hdu 1596 find the safest road(最短路,模版题)
题目 这是用Dijsktra做的,稍加改动就好,1000ms..好水.. #define _CRT_SECURE_NO_WARNINGS #include<string.h> #inclu ...
- poj 2485 Highways(最小生成树,基础,最大边权)
题目 //听说听木看懂之后,数据很水,我看看能不能水过 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stri ...