BZOJ3747:[POI2015]Kinoman(线段树)

时间:2022-08-28 18:54:57

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。

Solution

记一个数组$pre[i]$,表示$i$这个位置上的数上一次出现的位置在哪。

从左往右扫一边,区间$pre[i]+1$到$i$加上当前数的权值,$pre[pre[i]]+1$到$pre[i]$这段位置减去这个数的权值。然后查询区间$[1,i]$,取查询的$max$即为答案。

Code

 #include<iostream>
#include<cstdio>
#define N (1000009)
#define LL long long
using namespace std; struct Sgt{LL max,add;}Segt[N<<];
int n,m,f[N],w[N],pre[N],a[N];
LL ans; void Pushdown(int now)
{
Segt[now<<].add+=Segt[now].add;
Segt[now<<].max+=Segt[now].add;
Segt[now<<|].add+=Segt[now].add;
Segt[now<<|].max+=Segt[now].add;
Segt[now].add=;
} void Update(int now,int l,int r,int l1,int r1,int k)
{
if (l>r1 || r<l1) return;
if (l1<=l && r<=r1)
{
Segt[now].add+=k;
Segt[now].max+=k;
return;
}
Pushdown(now);
int mid=(l+r)>>;
Update(now<<,l,mid,l1,r1,k);
Update(now<<|,mid+,r,l1,r1,k);
Segt[now].max=max(Segt[now<<].max,Segt[now<<|].max);
} LL Query(int now,int l,int r,int l1,int r1)
{
if (l>r1 || r<l1) return -;
if (l1<=l && r<=r1) return Segt[now].max;
Pushdown(now);
int mid=(l+r)>>;
return max(Query(now<<,l,mid,l1,r1),Query(now<<|,mid+,r,l1,r1));
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; ++i)
scanf("%d",&f[i]), pre[i]=a[f[i]], a[f[i]]=i;
for (int i=; i<=m; ++i)
scanf("%d",&w[i]);
for (int i=; i<=n; ++i)
{
Update(,,n,pre[i]+,i,w[f[i]]);
Update(,,n,pre[pre[i]]+,pre[i],-w[f[i]]);
ans=max(ans,Query(,,n,,i));
}
printf("%lld\n",ans);
}

BZOJ3747:[POI2015]Kinoman(线段树)的更多相关文章

  1. 【BZOJ3747】&lbrack;POI2015&rsqb;Kinoman 线段树

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

  2. 【bzoj3747】&lbrack;POI2015&rsqb;Kinoman 线段树区间合并

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

  3. 【bzoj3747】&lbrack;POI2015&rsqb;Kinoman - 线段树(经典)

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

  4. &lbrack;bzoj3747&rsqb;&lbrack;POI2015&rsqb;Kinoman&lowbar;线段树

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

  5. Bzoj 3747&colon; &lbrack;POI2015&rsqb;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&colon; &lbrack;POI2015&rsqb;Kinoman&vert;线段树

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

  8. BZOJ3747 POI2015 Kinoman 【线段树】&ast;

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

  9. BZOJ&lowbar;3747&lowbar;&lbrack;POI2015&rsqb;Kinoman&lowbar;线段树

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

随机推荐

  1. requirejs 打包 添加版本号收集资料 待测试

    https://www.npmjs.org/package/rjs-optimhttps://www.npmjs.org/package/grunt-requirejs-md5指定js版本号 但不是M ...

  2. QImage::drawRect 和 fillRect在处理大面积区域时代价高昂

    项目需要生成一张掩码图, 出于操作pixel方便的考虑采用QImage(mono), 但在实现一个类似于 cvZero的操作时发现在图片面积较大时效率很低, 提醒一下 ps: 后来是改变策略, 用偏移 ...

  3. Ceph剖析:线程池实现

    线程池ThreadPool的实现符合生产者-消费者模型,这个模型解除生产者消费者间的耦合关系,生产者可以专注处理制造产品的逻辑而不用关心产品的消费,消费者亦然.当然,生产者消费者之间需要一个连接的纽带 ...

  4. MSBI--enlarge the DW database table volume

    我们在学习MSBI的时候,经常会使用官方提供的Adventureworks和AdventureworksDW示例数据库,但是官方提供的数据量有点小, 以DW为例,Factinternetsales只有 ...

  5. 使用reuseport和recvmmsg优化UDP服务器

    http://skoo.me/system/2014/03/18/udp-server-performance/ http://www.helplib.net/s/linux.die/65_3223/ ...

  6. Rocky&lpar;dfs&rpar;

    题目描述 Sylvester Stallion is an old horse who likes nothing better than to wander around in the fields ...

  7. 【WebApi系列】浅谈HTTP

    [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi如何传递参数 [04]详解WebApi测试和PostMan [05]浅谈WebApi Core ...

  8. &lbrack;BZOJ1609&rsqb; &lbrack;Usaco2008 Feb&rsqb; Eating Together麻烦的聚餐 &lpar;dp&rpar;

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  9. Nginx的日志优化

    1.日志轮询切割: 这篇文章已经对日志轮询切割做个介绍:请点击这里 2.不记录不需要的日志 在实际的工作中,对于负载均衡器健康节点检查或某些特定文件的日志,一般不需要记录下来,因为统计PV是按照页面计 ...

  10. JSP怎么将表单提交到对应的servlet

    昨天学习了这些内容,今天做一下分享吧,个人感觉挺乱的....呵呵,其实没事,慢慢就好了.难的不会,会的不难嘛!努力+认真就可以了,相信大家都可以的!加油!!! 下面的图是我用myeclipse建立的项 ...