题解:http://www.cnblogs.com/zyfzyf/p/4105184.html

一、下传标记写法

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. #define lson rt<<1,l,m
  6. #define rson rt<<1|1,m+1,r
  7. int Num,CH[],f,c;
  8. inline void R(int &x){
  9. c=;f=;
  10. for(;c<''||c>'';c=getchar())if(c=='-')f=-;
  11. for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
  12. x*=f;
  13. }
  14. typedef long long ll;
  15. int n,m,w[],now[],b[],fa[];
  16. ll ans,maxv[],delta[];
  17. void pushdown(int rt)
  18. {
  19. if(delta[rt])
  20. {
  21. delta[rt<<]+=delta[rt]; delta[rt<<|]+=delta[rt];
  22. maxv[rt<<]+=delta[rt]; maxv[rt<<|]+=delta[rt];
  23. delta[rt]=;
  24. }
  25. }
  26. void update(int ql,int qr,int v,int rt,int l,int r)
  27. {
  28. if(ql<=l&&r<=qr)
  29. {
  30. delta[rt]+=(ll)v;
  31. maxv[rt]+=(ll)v;
  32. return;
  33. }
  34. pushdown(rt); int m=l+r>>;
  35. if(ql<=m) update(ql,qr,v,lson);
  36. if(m<qr) update(ql,qr,v,rson);
  37. maxv[rt]=max(maxv[rt<<],maxv[rt<<|]);
  38. }
  39. ll query(int qr,int rt,int l,int r)
  40. {
  41. if(<=l&&r<=qr) return maxv[rt];
  42. pushdown(rt);
  43. int m=l+r>>; ll res=;
  44. if(<=m) res=max(res,query(qr,lson));
  45. if(m<qr) res=max(res,query(qr,rson));
  46. return res;
  47. }
  48. int main()
  49. {
  50. R(n); R(m);
  51. for(int i=;i<=n;++i) R(b[i]);
  52. for(int i=;i<=m;++i) R(w[i]);
  53. for(int i=;i<=n;++i)
  54. {
  55. fa[i]=now[b[i]];
  56. now[b[i]]=i;
  57. }
  58. for(int i=;i<=n;++i)
  59. {
  60. update(fa[i]+,i,(ll)w[b[i]],,,n);
  61. if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
  62. ans=max(ans,query(i,,,n));
  63. } printf("%lld\n",ans);
  64. return ;
  65. }

二、不下传标记写法

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. #define lson rt<<1,l,m
  6. #define rson rt<<1|1,m+1,r
  7. int Num,CH[],f,c;
  8. inline void R(int &x){
  9. c=;f=;
  10. for(;c<''||c>'';c=getchar())if(c=='-')f=-;
  11. for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
  12. x*=f;
  13. }
  14. typedef long long ll;
  15. int n,m,w[],now[],b[],fa[];
  16. ll ans,maxv[],delta[];
  17. void update(int ql,int qr,int v,int rt,int l,int r)
  18. {
  19. if(ql<=l&&r<=qr)
  20. {
  21. delta[rt]+=(ll)v;
  22. return;
  23. }
  24. int m=l+r>>;
  25. if(ql<=m) update(ql,qr,v,lson);
  26. if(m<qr) update(ql,qr,v,rson);
  27. maxv[rt]=max(maxv[rt<<]+delta[rt<<],maxv[rt<<|]+delta[rt<<|]);
  28. }
  29. ll query(int qr,int rt,int l,int r)
  30. {
  31. if(<=l&&r<=qr) return maxv[rt]+delta[rt];
  32. int m=l+r>>; ll res=;
  33. if(<=m) res=max(res,query(qr,lson));
  34. if(m<qr) res=max(res,query(qr,rson));
  35. return res;
  36. }
  37. int main()
  38. {
  39. R(n); R(m);
  40. for(int i=;i<=n;++i) R(b[i]);
  41. for(int i=;i<=m;++i) R(w[i]);
  42. for(int i=;i<=n;++i)
  43. {
  44. fa[i]=now[b[i]];
  45. now[b[i]]=i;
  46. }
  47. for(int i=;i<=n;++i)
  48. {
  49. update(fa[i]+,i,(ll)w[b[i]],,,n);
  50. if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
  51. ans=max(ans,query(i,,,n));
  52. } printf("%lld\n",ans);
  53. return ;
  54. }

【线段树】bzoj3747 [POI2015]Kinoman的更多相关文章

  1. BZOJ3747 POI2015 Kinoman 【线段树】*

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

  2. 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)

    传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...

  3. BZOJ3747: [POI2015]Kinoman

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

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

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

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

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

  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. 【bzoj3747】[POI2015]Kinoman - 线段树(经典)

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

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

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

随机推荐

  1. python单例与数据库连接池

    单例:专业用来处理连接多的问题(比如连接redis,zookeeper等),全局只有一个对象 单例代码def singleton(cls): instances = {} def _singleton ...

  2. Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法

    先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...

  3. jw player笔记二----修改logo

    一.修改HTML5模式下的logo 见http://blog.csdn.net/xiong_mao_1/article/details/17222757 二.修改FLASH模式下的logo IE7/8 ...

  4. Flex UI刷新后保持DataGrid中的ScrollBar的位置不变

    这是之前我发的一个贴子问题描述:http://q.cnblogs.com/q/53469/

  5. python 读 excel 模块: xlrd

    主要来自:[ python中使用xlrd.xlwt操作excel表格详解 ] 为了方便阅读, 我将原文两个模块拆分为两篇博文: [ python 读 excel 模块: xlrd ] [ python ...

  6. NGINX: 限制连接的实践 (Defense DDOS)

    参考: [ nginx防止DDOS攻击配置 ] 关于限制用户连接,Nginx 提供的模块: [ ngx_http_limit_req_module ] [ ngx_http_limit_conn_mo ...

  7. 常见协议基础知识总结--FTP协议

    FTP协议是一种基于客户端和服务器的文件传输协议,属于应用层协议,基于传输层的TCP协议: FTP主要分成主动模式和被动模式两种传输方式, 方式是相对服务器而言的,服务器主动发起数据连接即主动方式,使 ...

  8. Google Breakpad 之一,跨平台crash 处理上报系统简介

    Google Breakpad 之一,跨平台crash 处理上报系统简介 http://blog.csdn.net/wpc320/article/details/8290501 Google Brea ...

  9. Bean相关

    Bean容器初始化: 本地文件是绝对路径,classpath是相对路径.例子如下: Bean配置项: 常用Bean的配置项: (1)id :在整个IOC容器中,这个bean的唯一标识 (2)class ...

  10. 2.RDD的基本操作

    有些时候,我不太喜欢介绍相关概念什么的(其实是你懒吧),而是喜欢直接介绍用法. 所以RDD是什么这里也不再介绍了,可以自行百度,下面直接介绍rdd的一些操作 from pyspark import S ...