免费的馅饼 bzoj-2131

题目大意

注释:$1\le n \le 10^5$,$1\le w \le 10^8$。

想法:首先,想到dp

状态:dp[i][j]表示i分钟在位置j的最大收益

优化优化

状态:dp[i]表示最后收到i的最大收益。

转移:顺序枚举i:1->n即可。

然后,我们尝试优化

对于这个状态我们会发现转移的时候有一个绝对值的死东西,我们将它拆开就有:

2*t[j]+pos[j]<=2*t[i]+pos[i]且2*t[j]-pos[j]<=2*t[i]-pos[i]

然后按照减法为下标,用加法在树状数组上更新即可。

最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int w,n,f[100010],hash[100010],cnt,ans,s[100010];
  7. struct pies
  8. {
  9. int t,p,v,w1,w2;
  10. }a[100010];
  11. int cmp(const pies &a,const pies &b)
  12. {
  13. return a.w1<b.w1;
  14. }
  15. int lowbit(int x){return x&(-x);}
  16. int ask(int i)
  17. {
  18. int Max=0;
  19. while (i!=0)
  20. {
  21. Max=max(Max,s[i]);
  22. i-=lowbit(i);
  23. }
  24. return Max;
  25. }
  26. void add(int i,int val)
  27. {
  28. while (i<=cnt)
  29. {
  30. s[i]=max(s[i],val);
  31. i+=lowbit(i);
  32. }
  33. }
  34. int main()
  35. {
  36. scanf("%d%d",&w,&n);
  37. for (int i=1;i<=n;i++)
  38. {
  39. scanf("%d%d%d",&a[i].t,&a[i].p,&a[i].v);
  40. a[i].t*=2;
  41. a[i].w1=a[i].t-a[i].p;
  42. a[i].w2=a[i].t+a[i].p;
  43. hash[++cnt]=a[i].w2;
  44. }
  45. sort(hash+1,hash+cnt+1);
  46. cnt=unique(hash+1,hash+cnt+1)-hash-1;
  47. for (int i=1;i<=n;i++)
  48. {
  49. a[i].w2=lower_bound(hash+1,hash+cnt+1,a[i].w2)-hash;
  50. }
  51. sort(a+1,a+n+1,cmp);
  52. for (int i=1;i<=n;i++)
  53. {
  54. f[i]=ask(a[i].w2)+a[i].v;
  55. ans=max(ans,f[i]);
  56. add(a[i].w2,f[i]);
  57. }
  58. printf("%d\n",ans);
  59. return 0;
  60. }

小结:无。

[bzoj2131]免费的馅饼_树状数组的更多相关文章

  1. bzoj2131: 免费的馅饼(树状数组)

    Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成 ...

  2. 【bzoj2131】免费的馅饼 dp+树状数组

    题解: 昨天好像做了个几乎一模一样的题目 按照ti排序 |p[i]-p[j]|<=2*(t[i]-t[j]) 然后去绝对值变为三维偏序 发现后两个式子可以推出ti<tj 所以就变成二维偏序 ...

  3. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  4. BZOJ_3653_谈笑风生_树状数组

    BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...

  5. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  6. BZOJ_2141_排队_树状数组+分块

    BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...

  7. BZOJ_3132_上帝造题的七分钟_树状数组

    BZOJ_3132_上帝造题的七分钟_树状数组 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b), ...

  8. See you~_树状数组

    Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno ...

  9. nyoj116_士兵杀敌(二)_树状数组

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...

随机推荐

  1. 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. 辨异 —— Java 中 String 的相等性比较

    How do I compare strings in Java? 1. 语法知识 ==:判断的是引用的相等性(reference equality),也即是否为同一对象: .equals():判断的 ...

  3. C Tricks(十六)—— 复制字符串

    while (*s++ = *t++); // target ⇒ source // 对于 C 语言而言,赋值运算符返回左值

  4. B1218 [HNOI2003]激光炸弹 dp

    这个题其实打眼一看就知道差不多是dp,而且基本确定是前缀和.然后硬钢就行了...直接暴力预处理前缀和,然后直接dp就行. 题干: Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方 ...

  5. PCB Genesis增加点阵字 实现原理

    我们采用Genesis增加点阵字时,用Genesis增加Canned Text即可,但奥宝中文不支持,且字符种类是有限的呀 不过没关系,没有自己造呀.在这里我分享一种增加点阵字的实现方法 一.通过代码 ...

  6. vmware 14黑屏处理办法

    从12升级到了14,但是发现所有的虚拟机都不能用了,黑屏.挂起的时候反而会显示界面,但是继续运行就是黑屏. 记录下解决办法. 修复LSP 以管理员身份运行CMD命令: netsh winsock re ...

  7. Could not create the view: An unexpected exception was thrown. Myeclipse空间报错

    我的路径D:\MyEclipse 10\.metadata\.plugins\org.eclipse.core.runtime\.settings 我也遇到过这个问题,就是工作空间的问题好像是删除你工 ...

  8. xhtml1-frameset.dtd

    <!-- Extensible HTML version 1.0 Frameset DTD This is the same as HTML 4 Frameset except for chan ...

  9. JS排序之选择排序

    遍历这个数组,先确定索引为0的数字为暂时最小数, 在剩下的数据中,以第一个为标杆,和剩下的数依次进行比较,如果标杆大于某数,则进行索引交换,继续比较,则a[i]=min; 最后让a[i]与索引为0的数 ...

  10. Android RxVolley = Volley + RxJava + OkHttp

    Github:https://github.com/kymjs/RxVolley RxVolley使用文档 V1.0:http://rxvolley.mydoc.io/ 一.RxVolley使用指南 ...