Description

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

Input

第一行两个整数n,m(1<=m<=n<=1000000)。
第二行包含n个整数f[1],f[2],…,f[n](1<=f[i]<=m)。
第三行包含m个整数w[1],w[2],…,w[m](1<=w[j]<=1000000)。

Output

输出观看且仅观看过一次的电影的好看值的总和的最大值。

Sample Input

9 4
2 3 1 1 4 1 2 4 1
5 3 6 6

Sample Output

15
样例解释:
观看第2,3,4,5,6,7天内放映的电影,其中看且仅看过一次的电影的编号为2,3,4。

题解

线段树经典题

nxt[i]记录第i天的电影下次播放时间

枚举区间左端点,线段树维护每个位置作为右端点的答案

考虑l-r的左端点变为l+1

发现l到nxt[l]-1的答案减少w[f[l]]

而nxt[l]到nxt[nxt[l]]-1增加w[f[l]]

线段树维护,支持区间修改以及查询最大值

其实记录一段区间直接去修改边,每个数值都加,每个数值都减去。

 #include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std; int n,m;
int f[],w[],last[],next[];
struct Node
{
ll mx,flag;
}tr[]; inline void pushdown(int p,int l,int r)
{
if (l==r) return;
ll flag=tr[p].flag;tr[p].flag=;
tr[p<<].flag+=flag;tr[p<<|].flag+=flag;
tr[p<<].mx+=flag;tr[p<<|].mx+=flag;
// cout<<flag<<endl;
}
void add(int p,int l,int r,int x,int y,int z)
{
if (tr[p].flag) pushdown(p,l,r);
if (l==x&&r==y)
{
tr[p].flag=z,tr[p].mx+=z;
return;
}
int mid=(l+r)>>;
if (y<=mid) add(p<<,l,mid,x,y,z);
else if (x>mid) add(p<<|,mid+,r,x,y,z);
else add(p<<,l,mid,x,mid,z),add(p<<|,mid+,r,mid+,y,z);
tr[p].mx=max(tr[p<<].mx,tr[p<<|].mx);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&f[i]);
for (int i=;i<=m;i++)
scanf("%d",&w[i]);
for (int i=n;i>=;i--)
{
next[i]=last[f[i]];
last[f[i]]=i;
}
for (int i=;i<=m;i++)
{
if (last[i])
if (!next[last[i]]) add(,,n,last[i],n,w[i]);
else add(,,n,last[i],next[last[i]]-,w[i]);
// for (int j=1;j<=n;j++)
// cout<<tr[j].mx<<" ";
// cout<<endl;
}
ll ans=;
for (int i=;i<=n;i++)
{
ans=max(ans,tr[].mx);
int num=next[i];
if (num)
{
add(,,n,i,num-,-w[f[i]]);
if (next[num]) add(,,n,num,next[num]-,w[f[i]]);
else add(,,n,num,n,w[f[i]]);
}
else add(,,n,i,n,-w[f[i]]);
}
printf("%lld",ans);
}

【bzoj3747】[POI2015]Kinoman - 线段树(经典)的更多相关文章

  1. BZOJ3747:[POI2015]Kinoman(线段树)

    Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...

  2. 【BZOJ3747】[POI2015]Kinoman 线段树

    [BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...

  3. 【bzoj3747】[POI2015]Kinoman 线段树区间合并

    题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...

  4. [bzoj3747][POI2015]Kinoman_线段树

    Kinoman bzoj-3747 POI-2015 题目大意:有m部电影,第i部电影的好看值为w[i].现在放了n天电影,请你选择一段区间l~r使得l到r之间的好看值总和最大.特别地,如果同一种电影 ...

  5. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  6. 【BZOJ-3747】Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 715  Solved: 294[Submit][Stat ...

  7. 3747: [POI2015]Kinoman|线段树

    枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...

  8. BZOJ3747 POI2015 Kinoman 【线段树】*

    BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...

  9. BZOJ3747: [POI2015]Kinoman

    传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...

随机推荐

  1. .Net Framework Client Profile 和 .Net Framework的区别[转]

    原文链接 VS2010默认是以.Net Framework Client Profile为生成环境的,如果需要更多的功能,应该调用.Net Framework.

  2. glassfish应用服务器安装配置

    1.Glassfish4.0下载地址:https://glassfish.java.net/download.html#gfoseTab 2.将下载的glassfish-4.0.zip传输到服务器/h ...

  3. U9249 【模板】BSGS

    题目描述 给定a,b,p,求最小的非负整数x 满足a^x≡b(mod p) 若无解 请输出“orz” 输入输出格式 输入格式: 三个整数,分别为a,b,p 输出格式: 满足条件的非负整数x 输入输出样 ...

  4. IIS 安装了.net framework 4.0/4.5 却找不到相应应用程序池

    通常情况下是因为没注册造成的,有些安装包会自己帮你注册上有些不会,感觉略坑. 注册方法:在计算机中点击 开始菜单–>运行 拷贝以下内容运行一下即可. C:\WINDOWS\Microsoft.N ...

  5. Windows 下 IIS与Apache 共存

    在Windows服务器下, 安装了IIS以及Apache服务器, 如何使他们一起工作. 目前我面对的问题是, 只有一个IP地址,要通过不同的端口来访问不同的程序. 解决方案如下: 1.找到 Apach ...

  6. Android学习笔记(十一) Intent

    一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.In ...

  7. js阻塞ui进程涉及的知识点整理

    项目进行中遇到了同步ajax阻塞ui线程阻塞的问题,原因是执行两个同步ajax请求为一次完整的方法,因业务需求需要循环执行这个方法,检查后台返回的数据正确,但是由于ajax请求时间过长,考虑增加遮罩层 ...

  8. mybatis-paginator对SqlServer分页实现

    package com.github.miemiedev.mybatis.paginator.dialect; import com.github.miemiedev.mybatis.paginato ...

  9. getDate() 各种时间格式

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE() ...

  10. asterisk-java ami5 分机状态,挂机原因之类的

    这些东西网上随便一找一大堆,也只是记录下自己找的.方便以后自己复制粘贴用. 最后为啦实现分机状态在web的实时更新,我选择啦使用websocket. //获得分机状态 public static St ...