标题效果:有m点,每个点都有一个权值。现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大

想了很久,甚至神标题,奔说是水的问题……我醉了

枚举左点 对于每个请求留点右键点 树维护最大值

考虑每一个数对答案的贡献 记录一个数组next表示这个位置上的点下一次出现的位置 那么这个点贡献的作用范围就是[i,next[i]-1] 假设没有next就是[i,n]

于是我们先把全部第一个出现的数对答案的贡献增加线段树 然后从左到右扫一遍 每次统计完答案之后把i对答案的贡献去除 然后把next[i]对答案的贡献增加线段树

这常数我也是醉了……速度倒数第二啥的 正解一定不是这种……

此外POI2015是我穿错年代了?

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define M 1001001
  6. using namespace std;
  7. struct Segtree{
  8. Segtree *ls,*rs;
  9. long long num,mark;
  10. void Build_Tree(int x,int y);
  11. void Update(int x,int y,int l,int r,long long val);
  12. long long Get_Ans(int x,int y,int l,int r);
  13. }*root=new Segtree,mempool[M<<1],*C=mempool;
  14. int n,m;
  15. int a[M],w[M],next[M],last[M];
  16. bool v[M];
  17. long long ans;
  18. void Segtree :: Build_Tree(int x,int y)
  19. {
  20. int mid=x+y>>1;
  21. num=0;mark=0;
  22. if(x==y) return ;
  23. ls=C++;rs=C++;
  24. ls->Build_Tree(x,mid);
  25. rs->Build_Tree(mid+1,y);
  26. }
  27. void Segtree :: Update(int x,int y,int l,int r,long long val)
  28. {
  29. int mid=x+y>>1;
  30. if(x==l&&y==r)
  31. {
  32. num+=val;
  33. mark+=val;
  34. return ;
  35. }
  36. if(mark)
  37. {
  38. ls->num+=mark;
  39. rs->num+=mark;
  40. ls->mark+=mark;
  41. rs->mark+=mark;
  42. mark=0;
  43. }
  44. if(r<=mid) ls->Update(x,mid,l,r,val);
  45. else if(l>mid) rs->Update(mid+1,y,l,r,val);
  46. else ls->Update(x,mid,l,mid,val),rs->Update(mid+1,y,mid+1,r,val);
  47. num=max(ls->num,rs->num);
  48. }
  49. long long Segtree :: Get_Ans(int x,int y,int l,int r)
  50. {
  51. int mid=x+y>>1;
  52. if(x==l&&y==r)
  53. return num;
  54. if(mark)
  55. {
  56. ls->num+=mark;
  57. rs->num+=mark;
  58. ls->mark+=mark;
  59. rs->mark+=mark;
  60. mark=0;
  61. }
  62. if(r<=mid) return ls->Get_Ans(x,mid,l,r);
  63. if(l> mid) return rs->Get_Ans(mid+1,y,l,r);
  64. return max( ls->Get_Ans(x,mid,l,mid) , rs->Get_Ans(mid+1,y,mid+1,r) );
  65. }
  66. int main()
  67. {
  68. int i;
  69. cin>>n>>m;
  70. for(i=1;i<=n;i++)
  71. scanf("%d",&a[i]);
  72. for(i=1;i<=m;i++)
  73. scanf("%d",&w[i]);
  74. for(i=1;i<=n;i++)
  75. {
  76. if(last[a[i]])
  77. next[last[a[i]]]=i;
  78. else
  79. v[i]=1;
  80. last[a[i]]=i;
  81. }
  82. root->Build_Tree(1,n);
  83. for(i=1;i<=n;i++)
  84. if(v[i])
  85. root->Update(1,n,i,next[i]?next[i]-1:n,w[a[i]]);
  86. for(i=1;i<=n;i++)
  87. {
  88. ans=max(ans, root->Get_Ans(1,n,i,n) );
  89. root->Update(1,n,i,next[i]?next[i]-1:n,-w[a[i]]);
  90. if(next[i])
  91. root->Update(1,n,next[i],next[next[i]]?next[next[i]]-1:n,w[a[next[i]]]);
  92. }
  93. cout<<ans<<endl;
  94. }

BZOJ 3747 POI2015 Kinoman 段树的更多相关文章

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

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

  2. BZOJ 3747: [POI2015]Kinoman 【线段树】

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

  3. BZOJ 3747 POI2015 Kinoman

    因为上午没有准备够题目,结果发现写完这道题没题可写了QAQ 又因为这道题范围是100w,我写了发线段树,以为要T,上午就花了一个小时拼命卡常数 结果下午一交居然过了QAQ 我们考虑枚举L,求最大R使得 ...

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

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

  5. 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 830  Solved: 338 Description ...

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

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

  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(线段树)

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

随机推荐

  1. table明明设置了固定值

    IE真的快把我搞死了 0.0 可爱的迷人的让人醉了的IE你真棒 今天用表格写一个4列的表格 要实现的效果大概是这种 确有用普通浏览器都没有问题 非常easy明了的一个表格嘛!用IE8下面的看就成这样子 ...

  2. 理解Lambda表达式

    1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说.它是一个没有声明,没有访问修饰符,没有返回值.甚至没有名字的方法. 2.为什么我们需要使用La ...

  3. thinkPHP 模板的使用技巧(十三)

    原文:thinkPHP 模板的使用技巧(十三) 模板的使用技巧:页面跳转 .模板包含.模板渲染.模板的继承 页面跳转 <a href='__URL__/index'>我要跳转到首页面,用这 ...

  4. Java程序员们最常犯的10个错误(转)

    1.将数组转化为列表 将数组转化为一个列表时,程序员们经常这样做: 1 List<String> list = Arrays.asList(arr); Arrays.asList(&quo ...

  5. 【Cocos2d-X开发笔记】第一期 Cocos2d-X的环境搭建

          作者今天开始正式开始学习Cocos2d-X引擎进行游戏编程,预计两天会更新一期,最后实现ios游戏的appsore上线. (部分内容转载自:http://blog.csdn.net/yan ...

  6. Office 2016九大新功能

    Office 2016将于2015年秋季正式公布,下面是九大新功能. 预測 基于数据透视表的时间分组建模 联机分析(OLAP)下的PowerView 数据透视表(PivotTable)建模的自己主动关 ...

  7. SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试

    SynchronousQueue.LinkedBlockingQueue.ArrayBlockingQueue性能测试 JDK6对SynchronousQueue做了性能优化,避免对竞争资源加锁,所以 ...

  8. 菜鸟学Java(十九)——WEB项目測试好帮手,Maven+Jetty

    做WEB开发,測试是一件非常费时间的事情.所以我们就应该用更简单.更快捷的方式进行測试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven- ...

  9. 备份恢复与CRM集成的sharepoint站点

    在部署CRM与Sharepoint2010集成文档管理之后,一直担心如果需要在新服务器上重新部署CRM, 那么之前与CRM集成的Sharepoint2010文档内容,是否可以重新正确映射到相应的文档位 ...

  10. A Game of Thrones(4) - Eddard

    The visitors poured(倾泻:流出) through the castle gates in a river of gold and silver and polished steel ...