bzoj3252
简单题,每次取出最长链,然后对于练上每个点x,终点在其子树内的链都要减去a[x]
这显然可以用dfs序+线段树维护
显然每个点只要删一次即可,复杂度是O(nlogn)
type node=record
s,lx,rx,mx,lp,rp,pb,pe:longint;
end; var tree:array[..*,..] of node;
rev:array[..*] of boolean;
a:array[..] of longint;
q:array[..] of node;
j,t,ans,i,n,m,x,y,k,ch:longint;
c:node; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure put(var a:node; x:longint);
begin
a.lx:=x;
a.rx:=x;
a.mx:=x;
a.s:=x;
end; procedure update(var c:node; a,b:node);
begin
c.s:=a.s+b.s;
c.lx:=a.lx; c.lp:=a.lp;
if a.s+b.lx>c.lx then
begin
c.lx:=a.s+b.lx;
c.lp:=b.lp;
end;
c.rx:=b.rx; c.rp:=b.rp;
if b.s+a.rx>c.rx then
begin
c.rx:=b.s+a.rx;
c.rp:=a.rp;
end; c.mx:=a.rx+b.lx; c.pb:=a.rp; c.pe:=b.lp;
if c.mx<a.mx then
begin
c.mx:=a.mx;
c.pb:=a.pb;
c.pe:=a.pe;
end;
if c.mx<b.mx then
begin
c.mx:=b.mx;
c.pb:=b.pb;
c.pe:=b.pe;
end;
end; procedure build(i,l,r:longint);
var m,j:longint;
begin
if l=r then
begin
put(tree[i,],a[l]);
put(tree[i,],-a[l]);
for j:= to do
begin
tree[i,j].lp:=l;
tree[i,j].rp:=l;
tree[i,j].pb:=l;
tree[i,j].pe:=l;
end;
end
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
update(tree[i,],tree[i*,],tree[i*+,]);
update(tree[i,],tree[i*,],tree[i*+,]);
end;
end; procedure change(i:longint);
begin
swap(tree[i,],tree[i,]);
rev[i]:=not rev[i];
end; procedure push(i:longint);
begin
rev[i]:=false;
change(i*);
change(i*+);
end; procedure work(i,l,r:longint);
var m:longint;
begin
if l=r then
begin
put(tree[i,],y);
put(tree[i,],-y);
end
else begin
m:=(l+r) shr ;
if rev[i] then push(i);
if x<=m then work(i*,l,m)
else work(i*+,m+,r);
update(tree[i,],tree[i*,],tree[i*+,]);
update(tree[i,],tree[i*,],tree[i*+,]);
end;
end; function ask(i,l,r:longint):node;
var m:longint;
s,s1,s2:node;
begin
if (x<=l) and (y>=r) then exit(tree[i,])
else begin
m:=(l+r) shr ;
if rev[i] then push(i);
if y<=m then exit(ask(i*,l,m));
if x>m then exit(ask(i*+,m+,r));
s1:=ask(i*,l,m);
s2:=ask(i*+,m+,r);
update(s,s1,s2);
exit(s);
end;
end; procedure rever(i,l,r,x,y:longint);
var m:longint;
begin
if (x<=l) and (y>=r) then change(i)
else begin
m:=(l+r) shr ;
if rev[i] then push(i);
if x<=m then rever(i*,l,m,x,y);
if y>m then rever(i*+,m+,r,x,y);
update(tree[i,],tree[i*,],tree[i*+,]);
update(tree[i,],tree[i*,],tree[i*+,]);
end;
end; begin
readln(n);
for i:= to n do
read(a[i]);
build(,,n);
readln(m);
for i:= to m do
begin
read(ch);
if ch= then
begin
readln(x,y,k);
ans:=;
t:=;
for j:= to k do
begin
c:=ask(,,n);
if c.mx> then ans:=ans+c.mx
else break;
rever(,,n,c.pb,c.pe);
inc(t);
q[t]:=c;
end;
for j:=t downto do
rever(,,n,q[j].pb,q[j].pe);
writeln(ans);
end
else begin
readln(x,y);
work(,,n);
end;
end;
end.
bzoj3252的更多相关文章
- 【BZOJ3252】攻略(长链剖分,贪心)
[BZOJ3252]攻略(长链剖分,贪心) 题面 BZOJ 给定一棵树,每个点有点权,选定\(k\)个叶子,满足根到\(k\)个叶子的所有路径所覆盖的点权和最大. 题解 一个假装是对的贪心: 每次选择 ...
- BZOJ3252 攻略(贪心+dfs序+线段树)
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...
- 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)
[BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- [bzoj3252]攻略_dfs序_线段树_贪心
攻略 bzoj-3252 题目大意:给定一棵n个节点的有根树,点有点权.让你选出至多k个节点,使得他们到根的链的并最大. 注释:$1\le n\le 2\cdot 10^5$,$1\le val_i\ ...
- BZOJ3252: 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景 ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- BZOJ3252: 攻略 可并堆
网上有很多人说用dfs序+线段树做...其实stl的堆可以...可并堆可以...很多奇奇怪怪的东西都能做... 可并堆比较好想...也比较好写... 分析: 首先,这是一个网络流做不了的题...数据太 ...
- 【BZOJ3252】攻略
题解: 首先贪心的会发现我们每次一定会选当前权值和最大的那个 然后在于怎么维护这个最大值 我们发现每个修改实际上是对沿途所有点的子树的修改 所以用线段树维护就可以了.. 另外注意有重复部分,但一定是包 ...
- BZOJ3252攻略——长链剖分+贪心
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
随机推荐
- Eclipse 项目管理控制软件svn
^_^太开心了,之前以为eclipse只有tortoiseSVN而没有类似Visual Studio 2010里面的cvs的版本控制软件,不是我讨厌tortoiseSVN,而是我实在不习惯使用这个软件 ...
- Tesla为什么要公开专利
这是今天在网上看到Tesla公司的专利墙图片,还是比较有视觉冲击力的,正好可以转来当配图. 业界先锋Tesla日前惊世骇俗地公开电动汽车专利,赢得如潮好评:不过大家都知道,对于西方科技公司,专利历来是 ...
- Eclipse 环境安装和配置优化
1.下载相应的eclipse版本. 官方下载地址:http://www.eclipse.org/downloads/ juno版本的64位下载地址:http://www.eclipse.o ...
- FolderBrowserDialog 成员
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.folderbrowserdialog_members(v=vs.80).as ...
- 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题
此文由于当时不知道NHibernate的Sava方法不是更新操作,不知道Save就是Add,造成如下荒唐的求证过程,但结论是对的 ,可报废此文,特此声明. NHibernate--Save方法: Cu ...
- Oracle中的 UPDATE FROM 解决方法
转:http://www.cnblogs.com/JasonLiao/archive/2009/12/23/1630895.html Oracle中的 UPDATE FROM 解决方法 在表的更新操作 ...
- uva 12086 树状数组
树状数组 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...
- ARRAY_SIZE宏
宏ARRAY_SIZE,是求设备结构体中设备的个数, 定义在linux/kernel.h中 #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[ ...
- POJ 3280 Cheapest Palindrome(DP)
题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j ...
- Oracle 6 - 锁
Oracle锁没有额外的开销?Oracle的锁是怎么实现的?因为其他数据库,锁都是一种稀有资源和开销. 答:代码级实现?? 没有锁的话,并发更新就会有丢失更新的问题. 悲观锁和乐观锁 悲观锁一般用于有 ...