[bzoj2131]免费的馅饼_树状数组
免费的馅饼 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]
然后按照减法为下标,用加法在树状数组上更新即可。
最后,附上丑陋的代码... ...
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int w,n,f[100010],hash[100010],cnt,ans,s[100010];
- struct pies
- {
- int t,p,v,w1,w2;
- }a[100010];
- int cmp(const pies &a,const pies &b)
- {
- return a.w1<b.w1;
- }
- int lowbit(int x){return x&(-x);}
- int ask(int i)
- {
- int Max=0;
- while (i!=0)
- {
- Max=max(Max,s[i]);
- i-=lowbit(i);
- }
- return Max;
- }
- void add(int i,int val)
- {
- while (i<=cnt)
- {
- s[i]=max(s[i],val);
- i+=lowbit(i);
- }
- }
- int main()
- {
- scanf("%d%d",&w,&n);
- for (int i=1;i<=n;i++)
- {
- scanf("%d%d%d",&a[i].t,&a[i].p,&a[i].v);
- a[i].t*=2;
- a[i].w1=a[i].t-a[i].p;
- a[i].w2=a[i].t+a[i].p;
- hash[++cnt]=a[i].w2;
- }
- sort(hash+1,hash+cnt+1);
- cnt=unique(hash+1,hash+cnt+1)-hash-1;
- for (int i=1;i<=n;i++)
- {
- a[i].w2=lower_bound(hash+1,hash+cnt+1,a[i].w2)-hash;
- }
- sort(a+1,a+n+1,cmp);
- for (int i=1;i<=n;i++)
- {
- f[i]=ask(a[i].w2)+a[i].v;
- ans=max(ans,f[i]);
- add(a[i].w2,f[i]);
- }
- printf("%d\n",ans);
- return 0;
- }
小结:无。
[bzoj2131]免费的馅饼_树状数组的更多相关文章
- bzoj2131: 免费的馅饼(树状数组)
Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成 ...
- 【bzoj2131】免费的馅饼 dp+树状数组
题解: 昨天好像做了个几乎一模一样的题目 按照ti排序 |p[i]-p[j]|<=2*(t[i]-t[j]) 然后去绝对值变为三维偏序 发现后两个式子可以推出ti<tj 所以就变成二维偏序 ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- BZOJ_3653_谈笑风生_树状数组
BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- BZOJ_2141_排队_树状数组+分块
BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...
- BZOJ_3132_上帝造题的七分钟_树状数组
BZOJ_3132_上帝造题的七分钟_树状数组 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b), ...
- See you~_树状数组
Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno ...
- nyoj116_士兵杀敌(二)_树状数组
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...
随机推荐
- 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 ...
- 辨异 —— Java 中 String 的相等性比较
How do I compare strings in Java? 1. 语法知识 ==:判断的是引用的相等性(reference equality),也即是否为同一对象: .equals():判断的 ...
- C Tricks(十六)—— 复制字符串
while (*s++ = *t++); // target ⇒ source // 对于 C 语言而言,赋值运算符返回左值
- B1218 [HNOI2003]激光炸弹 dp
这个题其实打眼一看就知道差不多是dp,而且基本确定是前缀和.然后硬钢就行了...直接暴力预处理前缀和,然后直接dp就行. 题干: Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方 ...
- PCB Genesis增加点阵字 实现原理
我们采用Genesis增加点阵字时,用Genesis增加Canned Text即可,但奥宝中文不支持,且字符种类是有限的呀 不过没关系,没有自己造呀.在这里我分享一种增加点阵字的实现方法 一.通过代码 ...
- vmware 14黑屏处理办法
从12升级到了14,但是发现所有的虚拟机都不能用了,黑屏.挂起的时候反而会显示界面,但是继续运行就是黑屏. 记录下解决办法. 修复LSP 以管理员身份运行CMD命令: netsh winsock re ...
- Could not create the view: An unexpected exception was thrown. Myeclipse空间报错
我的路径D:\MyEclipse 10\.metadata\.plugins\org.eclipse.core.runtime\.settings 我也遇到过这个问题,就是工作空间的问题好像是删除你工 ...
- xhtml1-frameset.dtd
<!-- Extensible HTML version 1.0 Frameset DTD This is the same as HTML 4 Frameset except for chan ...
- JS排序之选择排序
遍历这个数组,先确定索引为0的数字为暂时最小数, 在剩下的数据中,以第一个为标杆,和剩下的数依次进行比较,如果标杆大于某数,则进行索引交换,继续比较,则a[i]=min; 最后让a[i]与索引为0的数 ...
- Android RxVolley = Volley + RxJava + OkHttp
Github:https://github.com/kymjs/RxVolley RxVolley使用文档 V1.0:http://rxvolley.mydoc.io/ 一.RxVolley使用指南 ...