bzoj2288 生日礼物 (线段树)
我当然想选最大的子段和啦 但要选M次 那不一定就是最好的
所以提供一个反悔的选项,我选了一段以后,就把它们乘个-1,然后再选最好的(类似于网络流的思路)
这个可以用线段树来维护,记一个区间包含左端点/右端点的最大值、最小值(因为要乘-1),还有它们的端点位置
然后一直找 直到最大值<=0
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn=1e5+,inf=0x3f3f3f3f; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
}
struct Pos{
int v,l,r;
Pos (int a=,int b=,int c=){v=a,l=b,r=c;}
};
struct Node{
Pos lmas,rmas,lmis,rmis,ma,mi,sum;
}tr[maxn<<]; bool laz[maxn<<];
int N,M,v[maxn]; bool operator <(Pos a,Pos b){
return a.v<b.v;
}
Pos operator +(Pos a,Pos b){
return Pos(a.v+b.v,a.l,b.r);
}
Pos operator -(Pos x){return Pos(-x.v,x.l,x.r);} Node operator +(Node a,Node b){
Node x;
x.sum=a.sum+b.sum;
x.lmas=max(a.lmas,a.sum+b.lmas);
x.rmas=max(b.rmas,a.rmas+b.sum);
x.lmis=min(a.lmis,a.sum+b.lmis);
x.rmis=min(b.rmis,a.rmis+b.sum);
x.ma=max(a.rmas+b.lmas,max(a.ma,b.ma));
x.mi=min(a.rmis+b.lmis,min(a.mi,b.mi));
return x;
} inline void build(int p,int l,int r){
if(l==r){
tr[p].sum=tr[p].lmas=tr[p].rmas=tr[p].lmis=tr[p].rmis=tr[p].ma=tr[p].mi=Pos(v[l],l,r);
}else{
int m=l+r>>;
build(p<<,l,m),build(p<<|,m+,r);
tr[p]=tr[p<<]+tr[p<<|];
}
} void deal(int p){
laz[p]^=;
Pos t=tr[p].lmas;
tr[p].lmas=-tr[p].lmis;tr[p].lmis=-t;
t=tr[p].rmas;
tr[p].rmas=-tr[p].rmis;tr[p].rmis=-t;
t=tr[p].ma;
tr[p].ma=-tr[p].mi;tr[p].mi=-t;
tr[p].sum=-tr[p].sum;
} inline void pushdown(int p){
if(!laz[p]) return;
deal(p<<),deal(p<<|);
laz[p]=;
} inline void rever(int p,int l,int r,int x,int y){
if(x<=l&&r<=y) deal(p);
else{
pushdown(p);
int m=l+r>>;
if(x<=m) rever(p<<,l,m,x,y);
if(y>=m+) rever(p<<|,m+,r,x,y);
tr[p]=tr[p<<]+tr[p<<|];
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=N;i++)
v[i]=rd();
int ans=;
build(,,N);
for(i=;i<=M;i++){
Pos x=tr[].ma;if(x.v<=) break;
ans+=x.v;
rever(,,N,x.l,x.r);
}
printf("%d\n",ans);
return ;
}
bzoj2288 生日礼物 (线段树)的更多相关文章
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...
- 【BZOJ-4556】字符串 后缀数组+二分+主席树 / 后缀自动机+线段树合并+二分
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 657 Solved: 274[Su ...
- 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)
佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...
- BZOJ4556 Tjoi2016&Heoi2016 字符串【后缀自动机+倍增+线段树合并】
Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
随机推荐
- Proper usage of Java -D command-line parameters
https://stackoverflow.com/questions/5045608/proper-usage-of-java-d-command-line-parameters https://c ...
- myecplise ssh项目配置上遇到的问题
版本:spring3.1+hib4.1+struts2.1 学习项目使用此版本运行时,总是会遇到各样的错误,在这里做一下记录. 问题1:log4j相关 spring的web项目,执行时报错: 信息: ...
- 《Effective C++》让自己习惯C++:条款1-条款4
条款1:视C++为一个语言联邦 可以将C++分为4个层次: 1.C:C++实在C语言的基础上发展而来的. 2:Object-Oriented C++:C++面向对象. 3:Template C++:C ...
- spring初始化bean时执行某些方法完成特定的初始化操作
在项目中经常会在容器启动时,完成特定的初始化操作,如资源文件的加载等. 一 实现的方式有三种: 1.使用@PostConstruct注解,该注解作用于void方法上 2.在配置文件中配置init-me ...
- Git SSH公钥配置
https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...
- InputFormat的数据划分、Split调度、数据读取
在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动相应的N个Map程序来分别处理它们.数据如何划分?Split如何调度(如何决定处理Split的Map程序应该运行在哪台Ta ...
- Hbase数据结构模型
- linux audit审计(4)--audit的日志切分,以及与rsyslog的切分协同使用
audit的规则配置稍微不当,就会短时间内产生大量日志,所以这个规则配置一定要当心.当audit日志写满后,可以看到如下场景: -r-------- 1 root root 8388609 Mar 3 ...
- Python:matplotlib绘制条形图
条形图,也称柱状图,看起来像直方图,但完是两码事.条形图根据不同的x值,为每个x指定一个高度y,画一个一定宽度的条形:而直方图是对数据集进行区间划分,为每个区间画条形. 将上面的代码稍微修改一 ...
- Previous Workflow Versions in Nintex Workflow
Previous Workflow Versions in Nintex Workflow September 4, 2013 It occurred to me that even though I ...