免费馅饼

题目链接:ybt金牌导航1-2-4

题目大意

有一个直线,在某一个时刻有一个馅饼会出现在一些位置,有它的价值。

一个人一开始可以站在直线的任意地方,然后他每个时刻可以不移动,或向任意一边移动一个单位或两个单位。

要你求这个人最多能拿多少价值的馅饼。

思路

我们看到这道题,弄出最普通的 dp。

\(f_i\) 为对于前 \(i\) 个馅饼,接住了第 \(i\) 个的最大贡献。

那就是枚举前面的每个点,还有不枚举,然后首先看能不能从那个点赶到这个点,然后就在可以的里面找最大值,然后加上这个点的贡献,就是 \(f_i\) 了。

那我们可以看出这是要馅饼按时间先后顺序排序。

而且看能否赶到,就要满足这个式子:(假设 \(i\) 赶到 \(j\),分别掉到格子的编号是 \(p_i\) 和 \(p_j\),掉的时间分别是 \(t_i\) 和 \(t_j\))

\(abs(p_i-p_j)\leq 2\times(t_j-t_i)\)

总的来说,就是这个:

\[f_j=\max_{\text{abs}(p_i-p_j)\leq 2\times(t_j-t_i)}\{f_i+v_j\}
\]

但是这样会超时,那我们考虑优化看馅饼的先后顺序的地方,看能不能通过这个先后顺序,直接快速地找到满足的点。

那我们考虑把式子化开,因为有绝对值,所有会有两个式子:

\(\left\{\begin{matrix}
2\times t_i+p_i\leq 2\times t_j+p_j&(p_i-p_j> 0)\\
2\times t_i-p_i\leq 2\times t_j-p_j&(p_i-p_j\leq 0)
\end{matrix}\right.\)

那它要分开两种,就很麻烦,我们但其实我们会发现,如果要的那个式子满足了,另一个也会满足。

那我们不妨让这两个式子都要满足。

那我们看怎么快速地找呢?

首先,因为两个式子的左右两边其实分别是 \(i,j\) 点的两个值,那我们可以一开始就算出来。

那我们考虑先按一个排好序,然后就只用判断另一个条件就可以了。

但是直接判断还是不行。

那我们考虑用一些数据结构来优化它。

那我们排好序之后,就要判断另一个值的大小关系。那只要大小关系,我们就可以把它离散化,不然值太大,数组装不下。

那离散化之后,怎么看大小呢?

我们想想,从小到大排序之后,意思就是可以从前面走到后面(当然这里是假设第二个条件都满足),那你现在就还要看第二个条件。

那就是当两个值,如果第一个值的位置比第二个值的位置靠前,而且第一个位置的第二个比较的值小于第二个值的第二个比较的值。那就是可以的。

你会发现它就是一个顺序对。

顺序对逆序对的这些玩意儿,自然就是树状数组。

当然,你用线段树也不是不可以,但是毕竟树状数组简单好打嘛。

(记得这个地方的地址是第二个匹配的值,因为树状数组地址其实就是一个匹配大小的东西,那就应该是最大贡献)

不过这个树状数组不是求逆序对个数或顺序对个数,而是在满足条件的地方取最大值。

那我们只要改一下,改成维护最大值即可。

那你就可以找到当你弄 \(f_i\) 的时候,最优是从哪里转移过来。

那至于 \(f_i\),就是最优还要加上拿到它这个馅饼能有的价值。

至于最后输出什么,就是所有最后结束的地方的最大值。那就是查询 \(1\sim num\) 中树状数组的最大值。(\(num\) 是离散化之后,有多少个不同的第二个匹配的值)

其实就是看找到最后选了哪里作为结尾使得价值最大。

那就是这样了。

代码

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; struct pie {
int t, p, v, l, r, num;
}a[100001], b[100001];
int w, n, c[100001], now;
int tree[100001], re; void add_num(int now, int addnum) {//树状数组(求最大值)
for (int i = now; i <= c[0]; i += i & (-i))
tree[i] = max(tree[i], addnum);
} int quest(int now) {
re = 0;
for (int i = now; i; i -= i & (-i))
re = max(re, tree[i]);
return re;
} bool cmp1(pie x, pie y) {
return x.l < y.l;
} bool cmp2(pie x, pie y) {
return x.r < y.r;
} 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].l = 2 * a[i].t - a[i].p;//算出比较依据
a[i].r = 2 * a[i].t + a[i].p;
a[i].num = i; b[i] = a[i];
} sort(b + 1, b + n + 1, cmp2);
c[1] = ++c[0];
a[b[1].num].r = c[1];//离散化(对于我们第二个要比较的值)
for (int i = 2; i <= n; i++) {
if (b[i].r != b[i - 1].r) ++c[0];
c[i] = c[0];
a[b[i].num].r = c[i];
} sort(a + 1, a + n + 1, cmp1);//先按第一个要比较的值排序,使枚举过去的时候第一个直接符合
for (int i = 1; i <= n; i++) {
now = quest(a[i].r);//比较第二个,找到比第二个比较的值比它更小中能获得的价值最大的
add_num(a[i].r, now + a[i].v);//捡这个
} printf("%d", quest(c[0]));//扫一遍全部,看全部方案中价值最大的 return 0;
}

【ybt金牌导航1-2-4】免费馅饼的更多相关文章

  1. 【ybt金牌导航1-2-6】【luogu P2467】地精部落

    地精部落 题目链接:ybt金牌导航1-2-6 / luogu P2467 题目大意 有一个排列,要使得每个位置要么都比两边高,要么比两边低. 而且一定要以一高一低的方式排列. 两边的只用比旁边的那个高 ...

  2. 【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田

    优美玉米 / 方伯伯的玉米田 题目链接:ybt金牌导航1-2-5 / luogu P3287 题目大意 有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长. 思路 ...

  3. 【ybt金牌导航1-2-3】折线统计

    折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...

  4. 免费馅饼——G

    G. 免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果 ...

  5. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  6. HDU 1176 免费馅饼

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 1644 免费馅饼 题解(c++)(S.B.S.)

    1644 免费馅饼(巴蜀oj上的编号) 题面:          SERKOI最新推出了一种叫做“免费馅饼”的游戏.         游戏在一个舞台上进行.舞台的宽度为W格,天幕的高度为H格,游戏者占 ...

  8. 免费馅饼 Why WA

    免费馅饼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1576  Solved: 577 Description 都说天上不会掉馅饼,但有一天gameb ...

  9. HDU 1176免费馅饼 DP数塔问题转化

    L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

随机推荐

  1. 【Linux】在文件的指定位置插入数据

    今天遇到一个似乎很棘手的问题,要在文件的中间,插入几条配置 这里就以my.cnf这个文件为例 1 [mysqld] 2 datadir=/var/lib/mysql 3 socket=/var/lib ...

  2. 使用sqluldr2进行oracle数据库抽取时执行后无反应,也无日志

    使用sqluldr2进行oracle数据库表数据抽取时遇到执行后无反应,也不报错,也无日志输出的情况. 经过排查之后发现时由于oracle账户密码快要过期导致的(这也能出问题,我服,类似的plsql连 ...

  3. 计网Q1:多个方面比较电路交换、报文交换和分组交换的主要优缺点

    网上看到的带佬儿的帖子......膜过来<doge 原文链接: https://blog.csdn.net/njchenyi/article/details/1540657 电路交换: 由于电路 ...

  4. oracle分区表分区栏位NULL值测试

    实验在分区栏位为NULL时,分区表的反应 1.创建普通的分区表 CREATE TABLE MONKEY.TEST_PART_NULL_NORMAL ( ID NUMBER, ADD_DATE DATE ...

  5. 环境配置-Java-01-安装

    本文使用JDK1.8在windows64位系统下举例,其他版本在windows下的安装过程类似 0.百度云盘链接 考虑到官网下载需要登陆,这里给大家提供百度云盘链接(就是官网安装包),不过下载速度会比 ...

  6. 痞子衡嵌入式:MCUBootFlasher v3.0发布,为真实的产线操作场景而生

    -- 痞子衡维护的NXP-MCUBootFlasher工具(以前叫RT-Flash)距离上一个版本(v2.0.0)发布过去一年半以上了,这一次痞子衡为大家带来了全新版本v3.0.0,从这个版本开始,N ...

  7. Oracle19c的多租户笔记

    Oracle19c的多租户笔记 1.多租户的概念 PDB(PLUGGABLE DATABASE)可以理解为我们Oracle11gR2的数据库,只不过是一个实例上面可以放置多个数据库了.名称为插件式数据 ...

  8. mail Header Injection Exploit

    Preventing Email Header Injection - PHundamental PHP Best Practices - http://nyphp.org/phundamentals ...

  9. 阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网IP资源,可以绑定到阿里云专有网络VPC类型的ECS、NAT网关、私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS、NAT网关、SLB的解耦,满足灵活管理的要求。阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性络VPC类型的E

    阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网关.私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS.NAT网关.SLB的解耦,满足灵活管理的要求.

  10. pthon之变量

    1.变量由三部分组成: 变量名  =   值 如:name = 'xiaohan'     sex='男'   age = 20 2.变量名的规范 2.1 变量名只能是字母,数字或下划线的任意组合 2 ...