BZOJ_3747_[POI2015]Kinoman_线段树

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。


预处理出来第$i$天下一次播放$f[i]$的日期$nxt[i]$,类似这道题http://www.cnblogs.com/suika/p/8890570.html

先求出左端点为$1$的情况,即出现第一次$+1$,第二次$-1$.

然后考虑删除掉$i$这个位置对答案的贡献,在$i+1\thicksim nxt[i]$的位置上减一,在$nxt[i]\thicksim nxt[nxt[i]]-1$的位置上加一

每次求出$i\thicksim n$的最大值,可以用线段树维护。

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 1000050
  6. #define ls p<<1
  7. #define rs p<<1|1
  8. typedef long long ll;
  9. char nc() {
  10. static char buf[100000],*p1,*p2;
  11. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  12. }
  13. inline int rd() {
  14. register int x=0;
  15. register char s=nc();
  16. while(s<'0'||s>'9')s=nc();
  17. while(s>='0'&&s<='9')x=(x<<3)+(x<<1)+s-'0',s=nc();
  18. return x;
  19. }
  20. ll t[N<<2],add[N<<2];
  21. int f[N],w[N],nxt[N],n,m,now[N];
  22. void pushdown(int p) {
  23. ll d;
  24. if(d=add[p]) {
  25. add[ls]+=d; add[rs]+=d;
  26. t[ls]+=d; t[rs]+=d;
  27. add[p]=0;
  28. }
  29. }
  30. /*ll qmx(int l,int r,int x,int y,int p) {
  31. if(x<=l&&y>=r) return t[p];
  32. int mid=(l+r)>>11;
  33. ll re=0;
  34. pushdown(p);
  35. if(x<=mid) re=max(re,qmx(l,mid,x,y,ls));
  36. if(y>mid) re=max(re,qmx(mid+1,r,x,y,rs));
  37. return re;
  38. }*/
  39. void update(int l,int r,int x,int y,ll v,int p) {
  40. if(x<=l&&y>=r) {
  41. t[p]+=v; add[p]+=v;
  42. return ;
  43. }
  44. pushdown(p);
  45. int mid=(l+r)>>1;
  46. if(x<=mid) update(l,mid,x,y,v,ls);
  47. if(y>mid) update(mid+1,r,x,y,v,rs);
  48. t[p]=max(t[ls],t[rs]);
  49. }
  50. int main() {
  51. n=rd(); m=rd();
  52. register int i;
  53. for(i=1;i<=n;i++) f[i]=rd();
  54. for(i=1;i<=m;i++) w[i]=rd();
  55. for(i=n;i;i--) nxt[i]=now[f[i]],now[f[i]]=i;
  56. for(i=1;i<=m;i++) {
  57. if(now[i]) {
  58. if(!nxt[now[i]]) update(1,n,now[i],n,w[i],1);
  59. else update(1,n,now[i],nxt[now[i]]-1,w[i],1);
  60. }
  61. }
  62. ll ans=0;
  63. for(i=1;i<=n;i++) {
  64. ans=max(ans,t[1]);
  65. if(nxt[i]) {
  66. update(1,n,i,nxt[i]-1,-w[f[i]],1);
  67. if(nxt[nxt[i]]) update(1,n,nxt[i],nxt[nxt[i]]-1,w[f[i]],1);
  68. else update(1,n,nxt[i],n,w[f[i]],1);
  69. }else update(1,n,i,n,-w[f[i]],1);
  70. }
  71. printf("%lld\n",ans);
  72. }

BZOJ_3747_[POI2015]Kinoman_线段树的更多相关文章

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

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

  2. BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序

    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...

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

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

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

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

  5. 【BZOJ4383】[POI2015]Pustynia 线段树优化建图

    [BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...

  6. 【bzoj3747】Kinoman[POI2015](线段树)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3747 对于这种题,考虑固定区间的右端点为r,设区间左端点为l能取得的好看值总和为a[l] ...

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

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

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

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

  9. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

随机推荐

  1. OC实现带弹跳动画按钮的界面控制器view

    很多应用都有带弹跳动画发布界面,这里用一个 UIViewController 实现这种效果,外界只要 modal出不带动画这个控制器就可以实现 #import "BSPublishVC.h& ...

  2. 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql

    c#代码,批量导入数据代码 public class MySql_Target : ZFCommon.DataAccesser.Base.DABase { public MySql_Target() ...

  3. webpack 4.x 遇到的错误

    由于之前重装电脑,很多之前的小Demo 现在都跑不起来.特别是webpack一直在报错. webpack 安装node 全局安装webpack,webpack-cli(一定要全局安装) 项目初始化 w ...

  4. iframe实现局部刷新和回调(转)

    今天做项目遇到一个问题.就是提交表单的时候,要在后台验证用户名是否存在和验证码是否正确. 当验证码或者用户名存在的时候.在后台弹窗提示.可页面原本file里面符合要求的值刷新没了.用户体验不好.因为用 ...

  5. access窗体主体居中

    Private Sub Form_Load()DoCmd.Echo False Dim x, y As IntegerDoCmd.Maximizex = Me.WindowWidthy = Me.Wi ...

  6. redis分布式锁实践

    分布式锁在多实例部署,分布式系统中经常会使用到,这是因为基于jvm的锁无法满足多实例中锁的需求,本篇将讲下redis如何通过Lua脚本实现分布式锁,不同于网上的redission,完全是手动实现的 我 ...

  7. Day13 CSS的与应用

    老师博客:http://www.cnblogs.com/yuanchenqi/articles/6856399.html 1,CSS选择器的应用: CSS规则有两个主要部分构成:选择器,以及一条或多条 ...

  8. 如何使你的Ajax应用内容可让搜索引擎爬行

    This document outlines the steps that are necessary in order to make your AJAX application crawlable ...

  9. 保证你能看懂的KMP字符串匹配算法

    文章转载自一位大牛: 阮一峰原网址http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm ...

  10. vue.js中的全局组件和局部组件

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...