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),某 ...
随机推荐
- UI控件tag属性和魔法数字的处理
说明:tag属性有很大的用处,它就好像每个UI控件的id,当多个按钮指向同一个监听方法时,可以给方法带参数UIButton,然后根据不同的tag值 来判断执行哪个按钮的监听事件: - (IBActio ...
- Java 8 VM GC Tuning Guide Charter3-4
第三章 Generations One strength of the Java SE platform is that it shields the developer from the compl ...
- bnuoj 4208 Bubble sort
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4208 [题意]:如题,求冒泡排序遍历趟数 [题解]:这题开始2B了,先模拟TLE,然后想了一下,能不 ...
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- css块级元素、行内元素
说说对html页面元素的排列认识: html中所有元素从上到下排列,所以需要css来对其中的元素进行排序.调节样式,并用js为其添加交互效果. css的排序.定位是相对块级元素而言的,margin/p ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- 为什么乱码:<meta http-equiv="content-type">前的非ANSI字符
为什么乱码:<meta http-equiv="content-type">前的非ANSI字符 浏览器检测网页字符集的默认顺序 浏览器的网页字符集检测顺序通常是: ch ...
- Unity3D研究院之IOS全自动打包生成ipa
接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿.. 建议大家先看一下上一篇文章.http://www.xuanyusong.com/ ...
- unity与Android相互调用
原地址:http://www.cnblogs.com/ayanmw/p/3727782.html 现在unity 导出的android客户端需要调用 Android 的支付SDK,但是unity与an ...
- POJ 2823 Sliding Window (线段树/单调队列)
题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...