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),某 ...
随机推荐
- 初识PCA数据降维
PCA要做的事降噪和去冗余,其本质就是对角化协方差矩阵. 一.预备知识 1.1 协方差分析 对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这 ...
- UI框架说明
JQueryEasyUI jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编 ...
- 使用NodeJs,实现数据抓取
学习笔记 前言 近期做一个数据抓爬工具,最开始使用的是C#控制台应用,同时正则表达式去过滤数据,看着还行,可每次运行都依附于.net framework很是不爽,于是想整点其他的方法.本人还是比较喜欢 ...
- LVS+Keepalived实现高可用集群
LVS+Keepalived实现高可用集群来源: ChinaUnix博客 日期: 2009.07.21 14:49 (共有条评论) 我要评论 操作系统平台:CentOS5.2软件:LVS+keepal ...
- Observer Pattern
Motivation We can not talk about Object Oriented Programming without considering the state of the ob ...
- Binary Search Tree In-Order Traversal Iterative Solution
Given a binary search tree, print the elements in-order iteratively without using recursion. Note:Be ...
- [shell编程]正则表达式
如果在shell脚本中处理数据文件,那么我们就必须熟悉正则表达式.正则表达式是用来过滤数据流中文本的模式模板,模式由标准文本字符和特殊字符组成.正则表达式用特殊字符来匹配一系列一个或多个字符,要想掌握 ...
- javascript加速运动
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- [SQL Server系] -- 基本概念
以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有 一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...
- RMQ和LCA
RMQ(Range Minimum/Maximum Query),即区间最值查询 查询很多的时候求[l,r]的最大值可以弄一个数组f[i,j]表示i~j的最大值 //这个是线段树 rmq是f[i,j] ...