正题

luogu 7302
金牌导航 数据结构优化DP-4


题目大意

在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你tit_iti​时在wiw_iwi​,就能获得该金币,每个单位时间你最多可以移动两个单位距离,现在问你最大价值是多少


解题思路

由于坐标轴较大,所以考虑从n下手

设f_i为捡到第i个金币的最大价值,那么有:

fi=min⁡∣wi−wj∣⩽2×(ti−tj)(fj+si)f_i=\min_{|w_i-w_j|\leqslant 2\times(t_i-t_j)}(f_j+s_i)fi​=∣wi​−wj​∣⩽2×(ti​−tj​)min​(fj​+si​)

考虑优化,先把条件拆开:
{2ti−wi⩾2tj−wj(wi⩾wj)2ti+wi⩾2tj+wj(wi<wj)\left\{\begin{matrix}2t_i- w_i\geqslant 2t_j - w_j\ \ (w_i\geqslant w_j)\\ 2t_i+ w_i\geqslant 2t_j + w_j\ \ (w_i<w_j)\end{matrix}\right.{2ti​−wi​⩾2tj​−wj​  (wi​⩾wj​)2ti​+wi​⩾2tj​+wj​  (wi​<wj​)​

不难证明:当满足当前情况的条件时,另一情况的条件也满足,那么就是要同时满足两个条件

上式是二维偏序,可以先排序,然后用树状数组存储解决


代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
using namespace std;
int n, m, bn, b[N], c[N];
struct node
{int t, w, s, g1, g2;
}a[N];
void add(int x, int y)
{for (; x <= 100000; x += x&-x)c[x] = max(c[x], y);return;
}
int ask(int x)
{int g = 0;for (; x; x -= x&-x)g = max(g, c[x]);return g;
}
bool cmp(node a, node b)
{return a.g2 < b.g2;
}
int main()
{scanf("%d%d", &m, &n);for (int i = 1; i <= n; ++i){scanf("%d%d%d", &a[i].t, &a[i].w, &a[i].s);a[i].g1 = 2 * a[i].t - a[i].w;//计算两个偏序值a[i].g2 = 2 * a[i].t + a[i].w;b[i] = a[i].g1;}sort(b + 1, b + 1 + n);bn = unique(b + 1, b + 1 + n) - b - 1;for (int i = 1; i <= n; ++i)a[i].g1 = lower_bound(b + 1, b + 1 + bn, a[i].g1) - b;//离散化sort(a + 1, a + 1 + n, cmp);for (int i = 1; i <= n; ++i)add(a[i].g1, ask(a[i].g1 - 1) + a[i].s);//第二维偏序printf("%d", ask(100000));return 0;
}

【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)相关推荐

  1. 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)

    正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...

  2. 【树状数组】递增子序列(金牌导航 数据结构优化DP-1)

    递增子序列 金牌导航 数据结构优化DP-1 题目大意 给出一个序列,让你求长度为m的单调递增子序列的个数 输入样例 3 2 1 1 2 7 3 1 7 3 5 9 4 8 输出样例 2 12 数据范围 ...

  3. 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

    正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上,距离第一个村庄did_idi​,在该村庄建立基站要花费cic_ici​,如果在离该村不大于sis_isi ...

  4. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  5. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  6. BZOJ2131免费的馅饼 DP+树状数组

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

  7. bzoj 2131: 免费的馅饼【dp+树状数组】

    简单粗暴的dp应该是把馅饼按时间排序然后设f[i]为i接到馅饼能获得的最大代价,转移是f[i]=max(f[j])+v[i],t[j]<=t[i],2t[i]-2t[j]>=abs(p[i ...

  8. luogu P2344 奶牛抗议 DP 树状数组 离散化

    P2344 奶牛抗议 最新讨论 暂时没有讨论 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在 ...

  9. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

最新文章

  1. 重磅开源!首个基于Transformer的视频理解网络来啦!
  2. JavaScript 进阶(二)变量作用域
  3. springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)
  4. 如何使用第三方日志记录提供程序替代.NET Core中的内置程序
  5. c++ queue学习
  6. oracle数据库read only,oracle 报错Linux-x86_64 Error: 30: Read-only file system
  7. 蓝色版去水印小程序源码+接口
  8. pcb板可挖孔吗_PCB板微孔加工方法之机械钻孔
  9. matex2推送鸿蒙系统,拜拜了,Powered by Android!
  10. 三、JVM — 类加载过程
  11. PDF编辑技巧 PDF怎么复制页面
  12. Java IO与NIO的区别
  13. 2手房地产营销企划书
  14. SecureCRT 8.3破解
  15. php自定义建站系统,PbootCMS(开源免费PHP建站系统) V2.0.9 官方版
  16. html5 canvas 绘制、移动方块及撤销操作
  17. 同心拼图(concentric mosaics)
  18. ERP : 经济批量
  19. 阿里文娱永叔:利器or成本损耗?算法不是黑匣子
  20. C++STL面试详解

热门文章

  1. html5 获取文件属性,H5新属性--file文件读取
  2. java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...
  3. qint64转为qstring qt_Qt中Qstring,char,int,QByteArray之间到转换
  4. 上海市二级c语言软件环境,上海市计算机二级C语言复习资料 word整理版.doc
  5. 区域转换为二值图像_Matlab图像处理系列教程(一)
  6. C++map容器-构造和赋值
  7. 英语期末复习unit 1-2课后习题第一题及背诵段落
  8. Redis分布式锁奥义
  9. python docx runs_别再问我Python怎么操作Word了!
  10. CoreJava 笔记总结-第十二章 并发-1