https://www.lydsy.com/JudgeOnline/problem.php?id=3747

https://www.luogu.org/problemnew/show/P3582

共有m部电影,编号为1~m,第i部电影的好看值为w[i]。
在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。
你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。

参考洛谷题解。

做法很神,为了符合人类直观思路,我们枚举左端点,然后O(log)找到答案最大的右端点。

然后就各种维护,维护一下前缀和,存在每个节点里。

当左端点移动时其原先对应的端点对后续的影响就消除了,此时需要重新修改各种值。

语言不是很好说,可以看我的代码,也可以看洛谷的全注释版。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,f[N],w[N],nxt[N],head[N];
ll tr[N*],lz[N*];
inline void add(int u,int cnt){
nxt[cnt]=head[u];head[u]=cnt;
}
inline void push(int a){
if(!lz[a])return;
lz[a<<]+=lz[a];lz[a<<|]+=lz[a];
tr[a<<]+=lz[a];tr[a<<|]+=lz[a];
lz[a]=;
}
void mdy(int a,int l,int r,int l1,int r1,int w){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1){
tr[a]+=w;lz[a]+=w;
return;
}
push(a);
int mid=(l+r)>>;
mdy(a<<,l,mid,l1,r1,w);mdy(a<<|,mid+,r,l1,r1,w);
tr[a]=max(tr[a<<],tr[a<<|]);
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)f[i]=read();
for(int i=;i<=m;i++)w[i]=read();
for(int i=n;i>=;i--)add(f[i],i);
for(int i=;i<=m;i++){
if(head[i]){
if(!nxt[head[i]])mdy(,,n,head[i],n,w[i]);
else mdy(,,n,head[i],nxt[head[i]]-,w[i]);
}
}
ll ans=;
for(int i=;i<=n;i++){
ans=max(ans,tr[]);
int t=nxt[i];
if(t){
mdy(,,n,i,t-,-w[f[i]]);
if(nxt[t])mdy(,,n,t,nxt[t]-,w[f[i]]);
else mdy(,,n,t,n,w[f[i]]);
}else mdy(,,n,i,n,-w[f[i]]);
}
printf("%lld\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

最新文章

  1. python3+ 模块学习 之 subprocess
  2. spring boot 框架 启动更新项目,以及生成 &quot;实体_&quot;文件
  3. Toast在关闭应用后还显示的解决办法
  4. .NET复习笔记
  5. Spring MVC的异步模式
  6. windows phone 浏览器 (1)
  7. ASP.NET——验证码的制作
  8. DateTime.Compare(t1,t2)比較两个日期大小
  9. [置顶] Nosql笔记(一)——关系型数据库回顾
  10. RedHat 7 常用命令总结
  11. C# WebAPI系列(1)
  12. vba统计电脑计算机名和登陆的用户名
  13. Dot &amp; cross product
  14. 【托业】托业(TOEIC)成绩 &amp; 等级划分以及评分标准
  15. JAVA基本语法测试
  16. org注释包
  17. hdu 4445 37届金华赛区 D题
  18. 【核心API开发】Spark入门教程[3]
  19. SDN 第一次作业
  20. 用 CSS 实现打印显示底色

热门文章

  1. linux-flock文件锁之实际运用
  2. APP产品设计流程图
  3. pycharm 3.4 亲测可使用到2019年2月的注册码,要用者从速
  4. 怎样安装JMeter
  5. MySQL☞数值处理函数
  6. Java开发工程师(Web方向) - 04.Spring框架 - 第5章.Web框架
  7. Java开发工程师(Web方向) - 01.Java Web开发入门 - 第1章.Web应用开发概述
  8. eclipse注释快捷键
  9. Java学习 &#183; 初识 多线程
  10. java学习过程小问题