【线段树】bzoj3747 [POI2015]Kinoman
题解:http://www.cnblogs.com/zyfzyf/p/4105184.html
一、下传标记写法
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int Num,CH[],f,c;
inline void R(int &x){
c=;f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
typedef long long ll;
int n,m,w[],now[],b[],fa[];
ll ans,maxv[],delta[];
void pushdown(int rt)
{
if(delta[rt])
{
delta[rt<<]+=delta[rt]; delta[rt<<|]+=delta[rt];
maxv[rt<<]+=delta[rt]; maxv[rt<<|]+=delta[rt];
delta[rt]=;
}
}
void update(int ql,int qr,int v,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
{
delta[rt]+=(ll)v;
maxv[rt]+=(ll)v;
return;
}
pushdown(rt); int m=l+r>>;
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
maxv[rt]=max(maxv[rt<<],maxv[rt<<|]);
}
ll query(int qr,int rt,int l,int r)
{
if(<=l&&r<=qr) return maxv[rt];
pushdown(rt);
int m=l+r>>; ll res=;
if(<=m) res=max(res,query(qr,lson));
if(m<qr) res=max(res,query(qr,rson));
return res;
}
int main()
{
R(n); R(m);
for(int i=;i<=n;++i) R(b[i]);
for(int i=;i<=m;++i) R(w[i]);
for(int i=;i<=n;++i)
{
fa[i]=now[b[i]];
now[b[i]]=i;
}
for(int i=;i<=n;++i)
{
update(fa[i]+,i,(ll)w[b[i]],,,n);
if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
ans=max(ans,query(i,,,n));
} printf("%lld\n",ans);
return ;
}
二、不下传标记写法
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int Num,CH[],f,c;
inline void R(int &x){
c=;f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
typedef long long ll;
int n,m,w[],now[],b[],fa[];
ll ans,maxv[],delta[];
void update(int ql,int qr,int v,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
{
delta[rt]+=(ll)v;
return;
}
int m=l+r>>;
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
maxv[rt]=max(maxv[rt<<]+delta[rt<<],maxv[rt<<|]+delta[rt<<|]);
}
ll query(int qr,int rt,int l,int r)
{
if(<=l&&r<=qr) return maxv[rt]+delta[rt];
int m=l+r>>; ll res=;
if(<=m) res=max(res,query(qr,lson));
if(m<qr) res=max(res,query(qr,rson));
return res;
}
int main()
{
R(n); R(m);
for(int i=;i<=n;++i) R(b[i]);
for(int i=;i<=m;++i) R(w[i]);
for(int i=;i<=n;++i)
{
fa[i]=now[b[i]];
now[b[i]]=i;
}
for(int i=;i<=n;++i)
{
update(fa[i]+,i,(ll)w[b[i]],,,n);
if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
ans=max(ans,query(i,,,n));
} printf("%lld\n",ans);
return ;
}
【线段树】bzoj3747 [POI2015]Kinoman的更多相关文章
- BZOJ3747 POI2015 Kinoman 【线段树】*
BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...
- 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)
传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...
- BZOJ3747: [POI2015]Kinoman
传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...
- BZOJ3747:[POI2015]Kinoman(线段树)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- 【BZOJ3747】[POI2015]Kinoman 线段树
[BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...
- 【bzoj3747】Kinoman[POI2015](线段树)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3747 对于这种题,考虑固定区间的右端点为r,设区间左端点为l能取得的好看值总和为a[l] ...
- 【bzoj3747】[POI2015]Kinoman 线段树区间合并
题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...
- 【bzoj3747】[POI2015]Kinoman - 线段树(经典)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- [bzoj3747][POI2015]Kinoman_线段树
Kinoman bzoj-3747 POI-2015 题目大意:有m部电影,第i部电影的好看值为w[i].现在放了n天电影,请你选择一段区间l~r使得l到r之间的好看值总和最大.特别地,如果同一种电影 ...
随机推荐
- maven与gradle的对比
Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...
- Kafka配置文档
http://kafka.apache.org/08/configuration.html
- tcp/ip网络协议学习
链路层介绍 网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层. 以太网 以 ...
- Spring学习--通过注解配置 Bean (二)
在 classpath 中扫描组件: 当在组件类上使用了特定的注解之后 , 还需要在 Spring 的配置文件中声明 <context:component-scan>: base-pack ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
- java封装的使用
一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...
- noip2013 提高组
T1 转圈游戏 题目传送门 果不其然 第一题还是模拟题 一波快速幂解决问题 #include<cstdio> #include<cstring> #include<alg ...
- The service base of EF I am using
using CapMon.Data; using System; using System.Collections.Generic; using System.Linq; using System.T ...
- DotNETCore 学习笔记 日志
Logging --------------------------------------------------------------------------------------- Impl ...
- vue 数组、对象 深度拷贝和赋值
由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝) 数组: let a = [11,22,33]; let b = a; / ...